0

ボタンを子として持つlinearLayoutがあります。ボタンの背景がフォーカスされたときに変更する必要があります。ボタンはタッチモードでフォーカス可能です。

次のセレクター xml をボタンに設定しました。

<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_focused="true"  
           android:drawable="@drawable/tile_focused" />
    <item android:drawable="@drawable/tile" /> <!-- default -->
</selector>

アップデート

if (layout == null) {
        layout = new LinearLayout(this);
        RelativeLayout.LayoutParams rlp = new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT);
        rlp.addRule(RelativeLayout.BELOW, R.id.toplogo);
        layout.setLayoutParams(rlp);
        layout.setId(wordLayoutID);
        layout.setBackgroundColor(Color.WHITE);
        mainLayout.addView(layout, rlp);
    } 

    Drawable tileBG = getResources().getDrawable(R.drawable.selector_tile);
    for (int i = 0; i < word.length(); i++) {
        Button btntile = new Button(this);
        LinearLayout.LayoutParams rlp =  new LinearLayout.LayoutParams(40, 40);
        btntile.setId(inputViewsIds+i);
        btntile.setBackgroundDrawable(tileBG);
        btntile.setFocusableInTouchMode(true);
        layout.addView(btntile, rlp);
    }

問題は、1 つのボタンにフォーカスを設定すると、すべてのボタンの背景が「tile_focused」に変わることです。問題はセレクターxmlにあると思います。ここで何が問題なのですか?

4

2 に答える 2

2

要するに、android:state_pressed="true"おそらく他のものも組み合わせたいようです。100%確信はありませんが、読み進めてください。

このような問題の場合、私は常にソース コードを見て、スタイルとテーマがどのように機能するかを確認します。ListView スタイルのソース コードは次のとおりです。

ソースを見ると、<item name="android:listSelector">@android:drawable/list_selector_background</item>もっと深く掘り下げたいところのように見えます。

そのドローアブルのソース コードは次のとおりです。これにより、目的を達成するためのガイダンスが提供されます。

https://github.com/android/platform_frameworks_base/blob/master/core/res/res/drawable/list_selector_background.xml

<selector xmlns:android="http://schemas.android.com/apk/res/android">

  <item android:state_window_focused="false" android:drawable="@color/transparent" />

  <!-- Even though these two point to the same resource, have two states so the drawable will invalidate itself when coming out of pressed state. -->
  <item android:state_focused="true"  android:state_enabled="false" android:state_pressed="true" android:drawable="@drawable/list_selector_background_disabled" />
  <item android:state_focused="true"  android:state_enabled="false"                              android:drawable="@drawable/list_selector_background_disabled" />
  <item android:state_focused="true"                                android:state_pressed="true" android:drawable="@drawable/list_selector_background_transition" />
  <item android:state_focused="false"                               android:state_pressed="true" android:drawable="@drawable/list_selector_background_transition" />
  <item android:state_focused="true"                                                             android:drawable="@drawable/list_selector_background_focus" />

</selector>

https://github.com/android/platform_frameworks_base/blob/master/core/res/res/values/styles.xml#L614

<style name="Widget.ListView" parent="Widget.AbsListView">
    <item name="android:listSelector">@android:drawable/list_selector_background</item>
    <item name="android:cacheColorHint">?android:attr/colorBackgroundCacheHint</item>
    <item name="android:divider">@android:drawable/divider_horizontal_dark_opaque</item>
</style>

<!-- Abstract ListView, nothing of importance here. -->
<style name="Widget.AbsListView">
    <item name="android:scrollbars">vertical</item>
    <item name="android:fadingEdge">vertical</item>
</style>
于 2012-04-17T18:36:58.910 に答える
1

この動作の根本的な原因は、すべてのボタンに使用した共通のタイル描画可能参照でした。これを変更して、ボタンごとに個別のドローアブルをロードしました。それはそれを修正しました。

みんなありがとう。

于 2012-04-18T06:02:22.027 に答える