ListView
で、各行にcheckboxを表示させるような話があって。 暗い背景なので、defaultのdesignだと見にくいんですね。 なのでcustomの白っぽいのに差し替えようとしたんですが、 なかなかうまく行かなかったのです。 基本的には、res/drawable/
に、
1
2
3
4
5
6
7
8
| <?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_enabled="false" android:drawable="@drawable/ic_check_disabled"/>
<item android:state_checked="true" android:state_pressed="false" android:drawable="@drawable/ic_check_on"/>
<item android:state_checked="false" android:state_pressed="false" android:drawable="@drawable/ic_check_off"/>
<item android:state_checked="true" android:state_pressed="true" android:drawable="@drawable/ic_check_on_pressed"/>
<item android:state_checked="false" android:state_pressed="true" android:drawable="@drawable/ic_check_off_pressed" />
</selector>
|
と書いて(状態判定は上の行から順番になされる模様)、layoutで、
1
2
3
4
5
| <CheckBox
android:id="@+id/historySelected"
style="@style/historyListCheckBox"
android:button="@drawable/selector_checkbox"
/>
|
というように参照すればいいんです。 が、それだとcheckしても絵が変わらなかったんですね。 別途OnClickListener
に、
1
| checkbox.setButtonDrawable(checkbox.isChecked() ? R.drawable.ic_check_on : R.drawable.ic_check_off);
|
が必要でした、というのはまだわかるんですが、 これを書いてもic_check_on
の絵にならなかったんですね(ic_check_off
の絵のまま)。 なんでだろ~、1日程悩みました。
結局、 stackoverflowのCan't create custom arrayadapter with appcompat elements inside of itに書いてあったんですけど、 ListView
のAdapterを作る時のContext
が、 getApplicationContext()
で得られたものであったこと、 が敗因でした。getApplication()
でもダメでした。 this
でないと、ic_check_on
がdrawされませんでした。
1
| adapter = new SimpleAdapter(this, someList, R.layout.some_listview, new String[]{...}, new int[]{R.id.someId,...});
|
this
で引き回すと、使ってるfieldとか色々引きずるから なるべくgetApplicationContext()
にしましょうね、 というのを聞いたことがあるのですが、 なるほどと思ってそうすると、 結構色んな箇所で出るべきものが出なくなるんですよね。 気を付けないとなりません。