とcompound drawableを使う

ワーニングが出る LinearLayoutはこんな感じ。

<LinearLayout
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:gravity="center" >

    <ImageView
        android:id="@+id/faceImageView"
        android:contentDescription="@string/face_imageview_desc"
        android:layout_width="40dp"
        android:layout_height="40dp"
        android:src="@drawable/ic_launcher" />

    <TextView
        android:id="@+id/nameTextView"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="@string/name_textview_label"
        android:paddingLeft="10dp" />

</LinearLayout>

単純に横方向のリニアレイアウトに絵と文字を並べただけ。


で、ワーニングは「LinearLayout の中の の並びは と compound drawableで置き換えられるよ!」って内容。今のままでもちゃんと表示できてるんだから余計なお世話だよ!


んじゃ、その TextViewと compound drawableって何?
調べてみたらこんなページを発見。

には上下左右に drawableをくっ付けることができるらしい。なので、を並べてで括らなくても良いらしい。
で、実際にはこんな感じで書ける。

    <TextView
        android:id="@+id/nameTextView"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="@string/name_textview_label"
        android:drawableLeft="@drawable/myIcon"
        android:paddingLeft="10dp" />

のだけど、これだとどんな画像を描くかは xmlファイルの中に "@drawable/myIcon" とかして決めうちしなければならないみたい。
"+id/xxxx" で指定できないのかな?と調べてみたけれど結局わからなかった…。


というわけで、こんな場合は Java のコードの方で描く事になる。

faceImageDrawable.setBounds(0,0,40,40);
TextView tv = (TextView)GetResourceById(R.id.nameTextView);
tv.setCompoundDrawables(faceImageDrawable, null, null, null);

faceImageDrawableはネットから落としてきたり、データベースから取り出したりした drawable。
サイズをキチンと設定してから TextViewに setCompoundDrawablesで設定する。


これでワーニングの出ていた最初の状態と同じように表示されるようになったのだけど、正直、このやり方の方が面倒な気がする。
というか、自分には最初にぱっと思い付いたワーニングが出てくるやり方の方がわかり易い。
でも、基本的にはプロジェクトのエラーはもちろん、ワーニングも全部消したいんだよな〜。