※ 引用 : http://blog.384ta.com/appcompatcheckbox
Android Support Library 22.1 の登場と共に、 AppCompatFooBar シリーズが充実しました。 Android 4.4 以下でも Material Design ライクな UI ウィジェットが使えるようになって、デザインの統一感が向上させられると思います。
そんな AppCompat シリーズの 1 つである AppCompatCheckBox を使うときにハマったことがあるので、共有したいと思います。話としては CheckBox に限らない、 AppCompatFooBar 全般の話なのですが、 CheckBox を触る上で出会った事柄なので …… 。
AppCompatCheckBox がレンダリングされない
CheckBox を使って UI を組んでいた場所を AppCompatCheckBox に置き換え、いざビルドしてみても CheckBox がレンダリングされないということが最初に躓いたところでした。
やりたいことは、
- support-v7 の AlertDialog の上に ListView を乗せたい
- ListView の各行で使う View の中では AppCompatCheckBox を乗せたい
というものです。上のスクリーンショットを見れば分かるのですが、 本来各行の右側にあるはずの AppCompatCheckBox が表示されていませんね。
また、この例では AppCompatTextView の文字色もかなり薄い色になっていますが、躓いた環境では XML 上で textColor を当てはめていて、これも問題の特定に時間がかかった原因でした。
※ AppCompatTextView / AppCompatCheckBox には android:theme="@style/AppTheme"
を適用しています。
原因は LayoutInflater の使い方
Dialog の表示には support-v4 の DialogFragment を使っています。 DialogFragment の onCreateDialog の中で ListView を inflate させるために使っていた LayoutInflater ですが、
Context context = getActivity().getApplicationContext();
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
Context#getSystemService
メソッド経由で取得していました。この LayoutInflater を、
LayoutInflater inflater = LayoutInflater.from(getActivity());
に変え、さらに、 ListView にセットしていたカスタム Adapter のコンストラクタにこの inflater を渡すようにしてみました。
// 抜粋
public static class MyAdapter extends ArrayAdapter<MyData> {
private int mResource;
private LayoutInflater mInflater;
public MyAdapter(Context context, int resource, List<MyData> objects, LayoutInflater inflater) {
super(context, resource, objects);
mResource = resource;
mInflater = inflater;
}
結果、
テーマがキチンと適用されて、表示されました。これまで LayoutInflater は特に理由がなければ Context#getSystemService
経由で取得していたのですが、それが災いしてハマってしまいました。不勉強でした ('A`)
AppCompatFooBar シリーズを使っていて、同じような問題に出会った人の助けになれば幸いです。