状態で色を変える

AndroidのViewはenable/disableの状態や、pressした状態で色や形などを変更できる。

例としてテキストに対して以下のように作成できる。

pressで色を変える。

pressで色を変える

ボタンでテキストのisEnabled属性を更新→値に応じて色を変える。

isEnabled

実装

drawable

drawableのリソースを作成し、以下の様にitem要素を追加する。

  • disableのとき → android:state_enabled=“false”
  • おさえたとき → android:state_pressed=“true”
  • それ以外デフォルト → 上記は書かない
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_enabled="false" android:color="#F00" />
    <item android:state_pressed="true" android:color="#0F0" />
    <item android:color="#000" />
</selector>

View

ここではTextViewで実装する。 他のViewでも同様。

<TextView
    android:id="@+id/textView"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="Foo"
    android:clickable="true"
    android:textColor="@drawable/stateful_text" />
<Button
    android:id="@+id/button"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Click" />

state_pressedを有効にするためには要素がクリックできる必要なのでandroid:clickable="true"を指定している。
ボタンなどもともとクリックできるViewのときは指定不要。

android:textColor="@drawable/stateful_text"で作成したdrawableのリソースを指定する。

ここまででpressしたら色が変わる。

pressで色を変える

ここではtextColorについて指定しているがbackgroundなどdrawableを指定できる属性であれば同様に指定できる。

Fragment

state_enabledはViewのisEnabledの値を変更すると

例としてボタンクリック時にTextViewisEnabledの値をトグルするようにする。

class FirstFragment : Fragment() {
    private var _binding: FragmentFirstBinding? = null
    private val binding get() = _binding!!

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)

        binding.button.setOnClickListener {
            // enable/disableを切り替える
            binding.textView.isEnabled = !binding.textView.isEnabled
        }
    }
}

ボタンクリックでisEnabledが変わるので、その値に応じて色が変わる。

isEnabled