状態で色を変える
AndroidのViewはenable/disableの状態や、pressした状態で色や形などを変更できる。
例としてテキストに対して以下のように作成できる。
pressで色を変える。

ボタンでテキストの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したら色が変わる。

ここではtextColorについて指定しているがbackgroundなどdrawableを指定できる属性であれば同様に指定できる。
Fragment
state_enabledはViewのisEnabledの値を変更すると
例としてボタンクリック時にTextViewのisEnabledの値をトグルするようにする。
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が変わるので、その値に応じて色が変わる。

\確かな知識を身に着けたい、Androidアプリ開発を学びたい人にオススメ!/
