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()
にしましょうね、
というのを聞いたことがあるのですが、
なるほどと思ってそうすると、
結構色んな箇所で出るべきものが出なくなるんですよね。
気を付けないとなりません。