ボタンなどの背景色を変えるには  
button.setBackgroundColor(Color.RED);  
などで出来ますが、buttonのレイアウトをdrawableで指定している場合、上の記述だと  
drawable指定が無効になります（Radiusなど無視され、ただの赤ボタンになる）

なのでGradientDrawableで背景情報を得て、変更しようとしましたが上手くいきません

```

    public class MainActivity extends Activity implements OnClickListener {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            findViewById(R.id.button).setOnClickListener(this);
        }
    
        public void onClick(View view) {
    
            // これだとxmlファイルのdrawable指定が無効になる
            // view.setBackgroundColor(Color.RED);
    
            GradientDrawable background = (GradientDrawable)view.getBackground();
            background.setColor(Color.RED);
    
        }
    }
    
```

activity_main.xmlに記述したボタンレイアウトはこんな感じです

```

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/button"
        android:background="@drawable/button_background" />
    
```

drawableのbutton_background.xml（角は丸く、灰色に設定してある。このカラーの部分を変えたい）

```

    <?xml version="1.0" encoding="utf-8"?>
    <selector xmlns:android="http://schemas.android.com/apk/res/android">
        <item>
            <shape android:shape="rectangle">
                <corners android:radius="5dp" />
                <solid android:color="#555555" />
            </shape>
        </item>
    </selector>
    
```

エミュは立ち上がり、ボタンを押すとエラーが出ます

どの部分が間違っているでしょうか？  
出来ればコード修正してもらうとありがたいです

また回答してくださいましたsetBackgroundResource(リソース）でもいいのですが  
drawableファイルの solid android:color="@color/COLORNAME" だけの動的変更はできるのでしょうか？
CC BY-SA 3.0
2016-01-09T04:29:13.623
20772
2016-01-09T09:16:16.080
2016-01-09T08:50:43.783
13949
13949
question
android
drawableで指定したレイアウト(shapeタグなど)の背景などの動的設定について
Javaのコードのみで制御する場合はこんな感じです。一旦Drawableを作って、それを適用します。この例の場合、color_flagの値で色々なカラーに変更出来ます。

```

    public class MainActivity extends Activity implements OnClickListener {
    Button bt;
    int color_flag = 0;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    bt = (Button) findViewById(R.id.button);
    bt.setOnClickListener(this);
    }
    
    @Override
    public void onClick(View v) {
    GradientDrawable drawable = new GradientDrawable();
    drawable.mutate();
    drawable.setShape(0);// 0がRECTANGLE
    drawable.setCornerRadius(5);
    if (color_flag == 0) {
    drawable.setColor(Color.parseColor("#FF3300"));//赤
    } else if (color_flag == 1) {
    drawable.setColor(Color.parseColor("#0000FF"));//青
    } else {
    drawable.setColor(Color.parseColor("#555555"));//元の色
    }
    bt.setBackground(drawable);
    }
    
    }
    
```
CC BY-SA 3.0
2016-01-09T06:42:07.040
20774
2016-01-09T09:16:16.080
2016-01-09T09:16:16.080
8795
8795
20772
answer