web-dev-qa-db-ja.com

Android:セレクター(StateListDrawable)をプログラムで更新する方法

ボタンのセレクターをプログラムで更新したい。

以下に示すxmlファイルを使用してこれを行うことができます

<?xml version="1.0" encoding="UTF-8"?>
<selector xmlns:Android="http://schemas.Android.com/apk/res/Android">
   <item Android:state_enabled="false"
         Android:drawable="@drawable/btn_off" />
   <item Android:state_pressed="true"
         Android:state_enabled="true" 
         Android:drawable="@drawable/btn_off" />
   <item Android:state_focused="true"
         Android:state_enabled="true" 
         Android:drawable="@drawable/btn_on" />
   <item Android:state_enabled="true" 
         Android:drawable="@drawable/btn_on" />
</selector>

同じことをプログラムで行いたいです。私は以下のようなものを試しました

private StateListDrawable setImageButtonState(int index)
{
    StateListDrawable states = new StateListDrawable();

    states.addState(new int[] {Android.R.attr.stateNotNeeded},R.drawable.btn_off); 
    states.addState(new int[] {Android.R.attr.state_pressed, Android.R.attr.state_enabled},R.drawable.btn_off);
    states.addState(new int[] {Android.R.attr.state_focused, Android.R.attr.state_enabled},R.drawable.btn_on);
    states.addState(new int[] {Android.R.attr.state_enabled},R.drawable.btn_on);

    return states;
}

しかし、うまくいきませんでした。

そして、Android:state_enabled="false"またはAndroid:state_enabled="true"をプログラムで設定する方法。

60
Mani

必要な状態の負の値を使用する必要があります。例えば。:

states.addState(new int[] {-Android.R.attr.state_enabled},R.drawable.btn_disabled);

Android.R.attr.state_enabledの前の「-」記号に注意してください。

112
Osi

ここでは非常に遅い応答ですが、StateListDrawableをプログラムで設定する際に他の誰かが問題を抱えている場合に備えて。次に、XMLファイルと同様に、StateListDrawableに状態を設定する順序が重要です。

たとえば、これは期待どおりに機能します。

StateListDrawable sld = new StateListDrawable();
sld.addState(new int[] { Android.R.attr.state_pressed }, new ColorDrawable(Color.GRAY));
sld.addState(new int[] {}, new ColorDrawable(Color.GREEN));

これはしません:

StateListDrawable sld = new StateListDrawable();
sld.addState(new int[] {}, new ColorDrawable(Color.GREEN));
sld.addState(new int[] { Android.R.attr.state_pressed }, new ColorDrawable(Color.GRAY));
8

コメントするのに十分な担当者がいませんが、受け入れられた答えは私にとってはうまくいきませんでした。

私の目標は、デザイナーがいくつかのボタンで有効、無効、および押された背景色を設定することでした。異なるディスプレイで色をテストするために使用するつもりでした。

私は他の人々がそれが彼らのために働かないことを述べたことに気づいた。

定義する必要がある状態は

  • 押されていない状態で、ボタンが有効で押されていないときに表示されます。
  • 押されて有効になっている、これはボタンが押されて有効になっているときに表示されるものです
  • 有効になっていません。これは、ボタンが無効になっているときに表示されるものです

以下に、状態の概要を示すコードを示します。 Color.Parse()を使用して色のintを生成し、それらをこのメソッドに渡してStateListDrawableを取得します。

private StateListDrawable createDrawable(int enabled, int pressed, int disabled) {
  StateListDrawable stateListDrawable = new StateListDrawable();

  stateListDrawable.addState(new int[] { -Android.R.attr.state_pressed, Android.R.attr.state_enabled }, new ColorDrawable(enabled));
  stateListDrawable.addState(new int[] { Android.R.attr.state_pressed, Android.R.attr.state_enabled }, new ColorDrawable(pressed));
  stateListDrawable.addState(new int[] { -Android.R.attr.state_enabled }, new ColorDrawable(disabled));

  return stateListDrawable;
}
6
Voski

「ボタンのセレクターをプログラムで更新する方法」という質問に答えます。 LinearLayoutImageViewが埋め込まれたTextViewのボタンを切り替えることを提案します。これを行うことには多くの利点があります。特に後でビューをカスタマイズすることにした場合には。この切り替えによって機能が失われることはありません。ボタンにアタッチできるのと同じイベントリスナーをアタッチすることはできますが、悪夢をスタイリングするボタン/タブを避けることができます。次に、layout.xmlからの関連コードを示します

    <LinearLayout 
        Android:id="@+id/button"
        style="@style/ButtonStyle">
        <ImageView 
            Android:id="@+id/background"
            Android:src="@drawable/custom_image"/>
        <TextView 
            style="@style/TextStyle"
            Android:text="Custom Button"
            Android:id="@+id/text"/>
    </LinearLayout> 

次に、drawableフォルダーにあるcustom_image.xmlというセレクターファイルがあります。セレクタファイルの内容は次のとおりです。

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:Android="http://schemas.Android.com/apk/res/Android">
    <item Android:drawable="@drawable/disabled_img"     Android:state_enabled="false" />
    <item Android:drawable="@drawable/unselected_img"     Android:state_selected="false" />
    <item Android:drawable="@drawable/selected_img"     Android:state_selected="true" />
</selector>

3つのソースイメージファイル(disabled_img.png、unselected_img.png、selected_img.png)も、drawableフォルダーにあります。

ここでJavaのコードに戻ります。多くの理由でファンキーなStateListDrawableガベージは必要ありません。 Javaコードで描画可能なリソースを管理している場合、根本的に間違ったことをしていることがわかります。

代わりに私が提案しているものがあります。ボタンを選択するたびに、このワンライナーをそこにポップします:

((LinearLayout)findViewById(R.id.button)).setSelected(true);

または、ボタンを無効な状態にしたいときはいつでも、もう1つのライナーがあります。

((ImageView)findViewById(R.id.background)).setEnabled(false);

この最後の例では、LinearLayout内のImageViewで無効状態を指定していることに注意してください。何らかの理由で、LinearLayoutの有効/無効状態を変更するたびに、セレクターがトリガーされません。代わりにImageViewで実行すると正常に機能します。

4
Temperage

コードがここにないため、StateListDrawableを追加する方法がわかりません。ただし、必ず ドキュメント を確認し、setState()を追加してください。

yourView.setEnabled(true)などのビューからプロパティを設定できます

それがお役に立てば幸いです

0
raukodraug