すでに正しく言及しているように、残念ながらgetButtonDrawable()
、使用するドローアブルを置き換える前に参照を取得することはできません。明らかに、Android のリソースをローカル プロジェクトにコピーし、それらを使用してCheckBox
's ボタンをリセットできますが、それは、デバイス メーカーがそれらのリソースに加える可能性のある変更は言うまでもなく、テーマのさまざまなスタイルをすべて考慮する必要があることを意味します。 . このレーンをたどることは不可能ではありませんが、単純に聞こえるものにとってはかなり面倒なことであることがわかります。
考慮すべきことは、次のことです。必要なドローアブルのリソース ID についてリソースをクエリします。そうすれば、ルックアップがそれを行うため、さまざまなテーマを明示的に処理する必要はありません。わずか数行で、この機能を専用のメソッドに簡単に組み込むことができます。例:
private static int getDefaultCheckBoxButtonDrawableResourceId(Context context) {
// pre-Honeycomb has a different way of setting the CheckBox button drawable
if (Build.VERSION.SDK_INT <= 10) return Resources.getSystem().getIdentifier("btn_check", "drawable", "android");
// starting with Honeycomb, retrieve the theme-based indicator as CheckBox button drawable
TypedValue value = new TypedValue();
context.getTheme().resolveAttribute(android.R.attr.listChoiceIndicatorMultiple, value, true);
return value.resourceId;
}
ボタン ドローアブルをカスタム イメージに設定し、後でリセットする簡単な例を以下に示します。チェック状態が変化するたびに、アプリ アイコンと元のボタン ドローアブルを切り替えるだけです。
CheckBox mCheckBox = (CheckBox) findViewById(R.id.checkbox);
mCheckBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override public void onCheckedChanged(CompoundButton button, boolean isChecked) {
button.setButtonDrawable(isChecked ? R.drawable.icon : getDefaultCheckBoxButtonDrawableResourceId(StackOverflowActivity.this));
}
});