2021年12月15日水曜日

android darkmode の theme でハマった忘備録

layout.xml において、テキスト色や背景色は、darkmode のテーマに沿って変更されるので問題無いのですが、リストのアイテムが選択された時の挙動をカスタマイズしている所で、罠におちました。
こんなセレクター list_item_color.xml を用意して
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">

  <item android:state_pressed="true"  android:drawable="@color/press" />
  
  <item android:state_checked="true"  android:drawable="@color/check" />

  <item android:state_selected="true" android:drawable="@color/white" />

  <item android:state_focused="true"  android:drawable="@color/red" />
  
  <item android:drawable="@color/black" />
 </selector>
リストアイテムとして foo_list_item.xml
<?xml version="1.0" encoding="utf-8"?>
<com.example.Util.CheckableLinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="@drawable/list_item_color"
    android:orientation="horizontal" >

    <CheckBox
        android:id="@+id/pnt_check"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_margin="5dp"
        android:paddingRight="5dp"
        android:text="@string/foo_name" />

    <TextView
        android:id="@+id/id_value"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_margin="5dp"
        android:layout_weight="1"
        android:gravity="center_vertical"
        android:textAppearance="?android:attr/textAppearanceMedium" />

    <ImageView
        android:id="@+id/detail_button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_vertical"
        android:layout_margin="5dp"
        android:focusable="false"
        android:src="@drawable/ic_action_right_dark" />

</com.example.Util.CheckableLinearLayout>
としていました。
ところが、リスト項目の背景に list_item_color.xml の item android:drawable の色 @color/black が使用され、
フォント色は何も指定していないけど、CheckableLinearLayout で制御されているためか、@color/black が使用されてしまいました。
これでは、黒背景に黒文字のため、画面が真っ黒で何も見えません。
リストを選択をすると、背景が違う色になるため、かろうじて黒文字が見える状態です。
list_item_color.xml は、テーマの影響を受けません。
よって、背景色は item android:drawable 固定です。よって正解は、
<?xml version="1.0" encoding="utf-8"?>
<com.example.Util.CheckableLinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="@drawable/list_item_color"
    android:orientation="horizontal" >

    <CheckBox
        android:id="@+id/pnt_check"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_margin="5dp"
        android:paddingRight="5dp"
        android:buttonTint="@color/white"
        android:textColor="@color/white"
        android:text="@string/foo_name" />

    <TextView
        android:id="@+id/id_value"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_margin="5dp"
        android:layout_weight="1"
        android:gravity="center_vertical"
        android:textColor="@color/white"
        android:textAppearance="?android:attr/textAppearanceMedium" />

    <ImageView
        android:id="@+id/detail_button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_vertical"
        android:layout_margin="5dp"
        android:focusable="false"
        android:src="@drawable/ic_action_right" />
    <!--
        _theme を指定すべきではない。
        android:src="@drawable/ic_action_right_dark" />
-->

</com.example.Util.CheckableLinearLayout>
と、チェックボックスの色と、テキスト色を固定で指定する事でした。
また、@drawable/ic_action_right_dark は darkmode の色なので、_dark を除いた @drawable/ic_action_right にすべきでした。
ただし、ここでは背景色が黒固定なので @color/white を指定すべきかもしれません。

0 件のコメント: