CheckBoxつきのListViewを作るとき

この記事は[要整理]タグがついています。冗長でわかりづらいので直してください。

はじめに

目的

Theme.LightでAlertDialogのsetMultiChoiceItemsつかったら文字も背景も白だしレイアウト書いてるわけじゃないので色変えられないしもうこれは独自に同じようなViewつくるしかない!

問題

普通のListViewはフォーカスやらクリックやらで標準ならオレンジなバックグラウンドになったりするけど、これにCheckBox(というかButton?)をのっけるとこれが効かなくなる。トラックボールでぐりぐりやるとちゃんとListのアイテムにフォーカスがあたるようだけどクリックしてもだめだったり。

ボタンがおまけパターン

例としてListViewのアイテムをよくある上下段のテキストと横にボタンがついてるやつをイメージ。書式がおかしいのはさておき。


  …テキストなし
  
  

IMoNiもこんなかんじなのかなー asteroid for ねとらじはこれのTextViewが4つになったやつでレイアウトしてます。
とりあえずCheckBoxに

    android:focusable="false"
    android:focusableInTouchMode="true"

とするといい感じになる。これだとトラックボールでCheckBoxクリックできない気がするけどリストクリックで拾うのはリストのアイテムであってCheckBoxはおまけなのでとりあえずこれでしのぐ。

ボタンのみ(今回のパターン)

で、ここまではまあよかったんだけど
次にListViewのアイテムがだけになった時…
さっきの例ではあくまでボタンがおまけで、リストをクリックしたときはリストのクリックで拾えばよかったんだけどCheckBoxがメインの場合はどうするか。アイテムがCheckBoxのみでandroid:layout_width="fill_parent"に設定。
同じようにfocusableをfalseにしておくと、

  • トラックボールでリストをクリック(もちろんリストの背景もオレンジのバックになる) -> CheckBoxもpressedになってるっぽい(focusableがtrueだとならない)。でもCheckBoxのonClickはこない(クリックしてるのはリストのアイテムで(アイテムにCheckBoxしかないとはいえ)CheckBoxそのものではないから?)
  • タッチでリストをクリック(オレンジ背景のクリック状態にはならない) -> CheckBoxのonClickが来る

タッチだと一瞬だからこれでもいいのかもしれないけど標準のリストからすればやっぱりタッチの時も背景変わってくれないとちょっと戸惑うと思う。
とりあえずトラックボールでクリックしたときにタッチと同じ動作にするならListのsetOnItemClickListenerでCheckBoxのクリックなりと同じ動作をするように書いておけば一応解決(ListのOnItemClickListenerではCheckBox#setCheckedだけにしてCheckBoxではOnCheckedChangeListenerで拾うようにってほうがいいかも)。でもタッチの時に背景が変わらないのは相変わらずなので微妙。

selector

結局CheckBoxに対してselectorを書いて逃げるのがいいのではないかという。でもどうやら自分で書くまでもなく android:background="@android:drawable/list_selector_background" で標準のが使えるみたいです。これでタッチでも普通のListViewと同じようにタッチでも背景が変わってわかりやすくなった。タッチとトラックボールでは本当は違うんだけど同じに見せかけている。これがいいかというと微妙だけど解決策の一つとして。

事件

CheckBoxにbackground設定したらCheckBoxにテキストが回り込んで隠れるという謎現象に。これについては Google グループ(最初の数レス以降は全く関係ない話題になっている…) に「paddingだぜ」みたいなことが書いてあるっぽいので設定したらたしかにチェックボックスの位置はかわらずテキストだけpaddingがとられた(チェックボックスが動かないってそれはそれでどうなんだ)。でもこれだとどのくらいのpaddingをとったらいいのかわからないし実機で確認しながらそれっぽい値を設定するってのもやっぱりスマートじゃない。しょうがないけど。あと、なんでbackgroundを使うと後ろに回り込んでしまうのかは謎のまま。

おわりに

はじめに書いたような原因でこんなことをしたわけだけど、こんなめんどくさいことになるならTheme.Lightやめてからそれぞれ色指定すればいいじゃんということに気が付いたけどもう遅い。ちなみにTheme.Lightはタブ使った時も文字色が白になって微妙になった気がするのでやっぱやめといたほうがいい気もします。びみょーなところが多いTheme.Light。
Theme.Lightは闇、Theme.Darkは光。
俺が闇プログラマー