私は夜間に使用するためにUIを赤味にする必要があるAndroid天文アプリを持っています。多くのUI要素でうまくいく体系がありますが、CompoundButtons:CheckBoxとRadioButtonに問題があります。Android上でCheckBoxとRadioButtonを塗る
基本的な考え方は、UI要素のDrawableを取得し、それにカラーフィルタを設定するものがある場合です。私の問題は、複合ボタンの適切なDrawableを見つけることです。私はgetCompoundDrawables()は私が必要とするだろうと思うだろうが、4つのdrawableのための返された配列は、常に4要素のnullsを含んでいます。
ここでは、UI要素の色付けを試みるためにトップレベルビューで呼び出す再帰コードを示します。
public static void setNightVisionBkg(View view)
{
if (view instanceof ViewGroup)
{
Drawable drawable = view.getBackground();
if (drawable != null)
drawable.setColorFilter(0xFFAA0000, PorterDuff.Mode.MULTIPLY);
ViewGroup group = (ViewGroup) view;
int numChildren = group.getChildCount();
for (int i = 0; i < numChildren; i++)
{
View v = group.getChildAt(i);
Drawable d = v.getBackground();
if (d != null)
d.setColorFilter(0xFFAA0000, PorterDuff.Mode.MULTIPLY);
if (v instanceof ViewGroup)
{
setNightVisionBkg((ViewGroup) v);
}
else if (v instanceof CompoundButton)
{
CompoundButton compBtn = (CompoundButton)v;
Drawable drawables[] = compBtn.getCompoundDrawables();
for (int j = 0; j < drawables.length; j++)
if (drawables[j] != null)
{
drawables[j].setColorFilter(0xFFAA0000, PorterDuff.Mode.MULTIPLY);
}
}
}
}
}
これは、後で動作しないCompoundButtonのDrawables(すべてのDrawableがnull)を取得していることに注意してください。
これを行う方法についてのご意見はありますか?私は私自身のカスタムdrawableを設定できることを知っていますが、私は標準のものを使い、可能であればcolorFilterを設定したいと考えています。
いいえ、ViewGroup以外のビューは処理されません(あなたは進歩したと言いましたが、それはあなたが意図したものだと思います)。フィルタを設定するコードはCheckBoxに対して呼び出されますが、Drawableがすべてnullであるため影響はありません。私はデバッガでこれを確認しました。 ViewGroupの内部テストは子供向けですから、冗長テストではないと思います。 – btschumy