tande lab.

[Android] 状態に応じて画像や色を自動的に選択してくれる selector

ボタンを押したときに画像や色を差し替える仕組みとして selector というものがあります。
shape などと一緒で xml で記述します。

状態変化は最大で 5 種類まで設定できるそうで、順番も以下の通りで書かないとうまく反映されないぽいです。

<?xml version="1.0" encoding="UTF-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
  <!-- フォーカス時 / focused -->
  <item
    android:state_focused="true"
    android:state_enabled="true"
    android:state_pressed="false"
    android:drawable="@drawable/focused" />
  <!-- 無効状態 かつ フォーカス時 / disabled and focused -->
  <item
    android:state_focused="true"
    android:state_enabled="false"
    android:state_pressed="false"
    android:drawable="@drawable/disabled_and_focused" />
  <!-- 押下状態 / pressed -->
  <item
    android:state_focused="true"
    android:state_enabled="true"
    android:state_pressed="true"
    android:drawable="@drawable/pressed" />
  <!-- 無効状態 / disabled -->
  <item
    android:state_enabled="false"
    android:drawable="@drawable/disabled" />
  <!-- 通常状態 / normal -->
  <item
    android:drawable="@drawable/normal" />
</selector>

<!-- アンカーになってしまうのを防ぐため、@ (アットマーク) を全角文字で記載しています。実際は半角です。-->

xml ファイルの名称は任意ですが、shape も selector も同じ xml ファイルでややこしいので、selector であるということが分かりやすいファイル名称にしておくと良さそうです。

例えば以下の例だと赤丸をつけてる 3 個のファイルが 1 個のボタンのために使われます。
https://lh4.googleusercontent.com/-fuyZc6lFolg/UTyVz1gE8fI/AAAAAAABRgs/P1L1g6WOvsM/s800/130310-0004.png

上から、

  • 通常状態と押下状態の shape ファイルの表示を切り替える selector ファイル
  • 通常状態の shape ファイル
  • 押下状態の shape ファイル

となります。

layout ファイルでボタンを指定する際は selector ファイルのみを指定すれば OK です。

参考サイト