ひだまりソケットは壊れない

ソフトウェア開発に関する話を書きます。 最近は主に Android アプリ、Windows アプリ (UWP アプリ)、Java 関係です。

まじめなことを書くつもりでやっています。 適当なことは 「一角獣は夜に啼く」 に書いています。

Android の ListView のアイテムの子要素の android:height="match_parent" が効かない

Android アプリ開発で、ListView の項目として FrameLayoutRelativeLayout を使っていたのですが、その子で android:height="match_parent" の指定がなされている view が全く表示されなくて困っていました。

原因を探ってみたところ、どうやら ListView の項目として表示されている view の子要素の android:height="match_parent" は有効でないようで、高さが 0 になっていたのが原因のようでした。

確認した API level

で確認しました。 API level 8 で試したときには "match_parent" の代わりに "fill_parent" を使用しました。

次のようなレイアウト XML があるとします。 (list_item.xml とします。)

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="80dp"
    android:background="#CCCCCC">

    <ImageView
        android:src="@drawable/ic_launcher"
        android:adjustViewBounds="true"
        android:layout_width="wrap_content"
        android:layout_height="50dp"
        android:padding="0dp"
        />
    <View
        android:layout_height="match_parent"
        android:layout_width="match_parent"
        android:background="#66000000"
        />

</FrameLayout>

このレイアウトを、次のように includeLinearLayout の中に読み込むと、期待通り view は高さ 80 dp で表示され、view 全体が #66000000 の色で覆われます。

<include layout="@layout/list_item" />

しかし、ListView の項目として表示すると、高さは ImageView の 50 dp で揃えられ、view 全体が #66000000 の色で覆われることはありませんでした。

具体的な表示としては下記のようになりました。

f:id:nobuoka:20130929141952p:plain

細かい原因や回避策などは不明

ちょこっとしか調べてなくて、今のところ詳しい原因はわかっていません。 Hierarchy Viewer で見ると、View の高さが 0 になっていたので android:height="match_parent" が効いてないのであろうことはわかるのですが、なんでそうなるのかは ListView などのソースコードを見るしかなさそうです。

f:id:nobuoka:20130929142931p:plain

そんなわけで特に問題の回避策は見つかってないのですが、そういう問題があるという情報自体が web 上にあまり見当たらなかったので、問題があるということだけ書き残しておきます。