AppCompatCheckBox でハマったこと

Android Support Library 22.1 の登場と共に、 AppCompatFooBar シリーズが充実しました。 Android 4.4 以下でも Material Design ライクな UI ウィジェットが使えるようになって、デザインの統一感が向上させられると思います。

そんな AppCompat シリーズの 1 つである AppCompatCheckBox を使うときにハマったことがあるので、共有したいと思います。話としては CheckBox に限らない、 AppCompatFooBar 全般の話なのですが、 CheckBox を触る上で出会った事柄なので …… 。

 AppCompatCheckBox がレンダリングされない

CheckBox を使って UI を組んでいた場所を AppCompatCheckBox に置き換え、いざビルドしてみても CheckBox がレンダリングされないということが最初に躓いたところでした。

001.png

やりたいことは、

  1. support-v7 の AlertDialog の上に ListView を乗せたい
  2. 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;
    }

結果、

002.png

テーマがキチンと適用されて、表示されました。これまで LayoutInflater は特に理由がなければ Context#getSystemService 経由で取得していたのですが、それが災いしてハマってしまいました。不勉強でした (‘A`)

AppCompatFooBar シリーズを使っていて、同じような問題に出会った人の助けになれば幸いです。

 
5
Kudos
 
5
Kudos

Now read this

DroidKaigi 2017:After / 1 登壇者視点の感想

DroidKaigi 2017 から帰ってきました。登壇の内容は前のエントリに任せるとして、イベントの感想を書こうと思います。思いついたトピックを適当に書いています。 人の多さ まず始めに、イベントの規模に驚きました。一昨年は 400 名。昨年は 600 名。そして今年は 800 名と増えていったそうです。一昨年から参加していますが、今年は本当に人が多いように思いました。 それを実感したのは、実はイベント本編前日の夜に開催された登壇者、スタッフ、... Continue →