2

次の (非常に一般的な) コードを使用して、Android アプリのチェックボックスの画像を変更しています。

    mCheck = (CheckBox) findViewById(R.id.chkMine);
    mCheck.setButtonDrawable(R.drawable.my_image);

と頼んでいる人を多く見かけます。しかし、私は2番目の部分を見たことはありません:

How do I put BACK the original checkbox imagery, later in my code?

Android のさまざまなバージョンで通常表示される元の画像が必要なため、すべての独自の画像 (チェック、チェックなし、ゴースト チェック、ゴースト チェックなしなど) をデザインしようとするのをためらっています。

おそらく、最初に(存在しない?)getButtonDrawable()呼び出しでデフォルトの画像を保存し、後で再利用しますか?

setButtonDrawable() を2回目に呼び出して変更を「元に戻す」のと同じくらい簡単だと思います。またはそれは?

ありがとう。

4

2 に答える 2

5

すでに正しく言及しているように、残念ながら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));
    }
});
于 2012-04-20T21:16:37.747 に答える
0

setButtonDrawable()への呼び出しが再び機能するはずの元の画像を取得すると思います。
ただし、リソースの代わりに、Android の元のリソースを参照します。

mCheck = (CheckBox) findViewById(R.id.chkMine);
mCheck.setButtonDrawable(android.R.drawable.*);

おそらく、自分でファイル名を検索する必要があります。

platforms > android-* > data > res > drawable-*
(source: accepted answer)

編集
ハ!Android R Drawables ^^ v ( クレジットMef )

于 2012-04-19T19:33:42.807 に答える