1. ホーム
  2. android

[解決済み] ListSelectorはリスト全体に適用されます。

2022-02-13 09:03:46

質問

単純なリストがあり、リストセレクタがあります。

<ListView android:id="@+id/list" android:layout_width="fill_parent"
    android:layout_height="fill_parent" android:layout_below="@+id/round"
    android:listSelector="#99000000" android:clickable="true" android:cacheColorHint="#00000000" android:background="#00000000">
</ListView>

android:listSelector="#99000000" が、選択された項目ではなく、リスト全体に "black alpha" の色が適用されていることがお分かりいただけると思います。


このような状態になりましたが、リスト全体はまだ黒くなっています。

::listview_background.xml

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
  <item android:state_enabled="false" android:state_focused="true"
        android:drawable="@drawable/list_normal" />
  <item android:state_pressed="true"
        android:drawable="@drawable/list_pressed" />
  <item android:state_focused="true"
        android:drawable="@drawable/list_active" />
</selector>

::カラーズ.xml

<resources>
    <drawable name="list_normal">#96FFFFFF</drawable>
    <drawable name="list_active">#66000000</drawable>
    <drawable name="list_pressed">#CA000000</drawable>
</resources>

::マイリストのxmlタグ

android:listSelector="@drawable/listview_background"

解決方法は?

私も同じような悩みを抱えていました。私はカスタムの背景画像を持っていますが、その背景画像のバリエーションを作るのは、すべての異なる状態を表現するのに面倒なので、避けたいのです。

つまり、フォーカスされたリスト項目の上に半透明のバーを重ね、ユーザーが "enter" キーなどをタップすると、より印象的でやや不透明な、押されたオーバーレイの色に点滅するようにしたいのです。

解決策は、listSelector 内で色を参照する @color や @drawable からは離れることでした。3x3 ピクセルの .png ファイルを 2 つ作成しました。それぞれガンマレイヤーで保存しました。私の場合、2つの同じ色をそれぞれGimpで混合し、カラーレイヤーに異なる透明度を持たせている。つまり、アイテムを選択すると25%の色のオーバーレイが表示され、それを押すと50%の色のpngが表示される。これらを bg_list_item_pressed.png と bg_list_item_highlighted.png として、drawable に配置しました。

そして、リストセレクタを設定しました。

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android"> 

  <!-- Selected --> 
  <item 
    android:state_focused="true" 
    android:state_pressed="false" 
    android:drawable="@drawable/bg_list_item_highlighted" /> <!--  @drawable/tab_focus -->

  <!-- Pressed -->
  <item 
    android:state_pressed="true" 
    android:drawable="@drawable/bg_list_item_pressed" /> <!--  @drawable/tab_press -->

</selector> 

そして、ListViewにlistSelector属性をレイアウトxmlで追加しました。

android:listSelector="@drawable/list_selector"
android:drawSelectorOnTop="true"

これで思い通りに動作するようになりました。Dパッドで行を選択し、Enterでクリックすることも含めて。ハイライト表示と、その後に押す色を、あるべき姿に正確にすることができました。