KonifarPod

AndroidでCustomDrawableStateが動かない時に確認すべきこと

   

Pocket

AndroidでCustomDrawableStateを作ったのにうまく機能しない問題にハマったのでメモ。

CustomDrawableStateの作り方自体はこちら ⇒ Custom drawable states in Android

 

(1)onCreateDrawableStateが呼ばれているか

上記の手順通りに実装しても、onCreateDrawableStateが呼ばれないことがあります。デバッグして呼ばれていなければ、android:duplicateParentState=“true”をレイアウトにつけると解決するかもしれません。

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:duplicateParentState="true">
    ...
</RelativeLayout>

参考 : onCreateDrawableState never call

 

(2)State更新時にrefreshDrawableStateを呼んでいるか

これを呼ばないと表示が更新されません。statusをセットしたら、ちゃんと呼んであげましょう。

public void setError(boolean isError) {
    this.isError = isError;
    refreshDrawableState();
}

 

(3)custom drawable の記述が間違っていないか

例えばこのように記述していた場合、state_errorになっても色は変わりません。

<xml version="1.0" encoding="utf-8">
<selector xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">
    <item android:drawable="@drawable/bg_white" android:state_pressed="false" />
    <item android:drawable="@drawable/bg_red" app:state_error="true" />
</selector>

上から順に評価されていくため、state_pressedじゃないから当てはまると判断されて上のitemが適用されてしまいます。

ちゃんとstateを指定してあげれば動くはずです。

<xml version="1.0" encoding="utf-8">
<selector xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">
    <item android:drawable="@drawable/bg_white" android:state_pressed="false" app:state_error=“false" />
    <item android:drawable="@drawable/bg_red" app:state_error="true" />
</selector>

 

 

こんなつまらないところでハマる人が1人でも減ることを祈ります。以上!

Pocket

 - Develop