1. ホーム
  2. android

[解決済み] RelativeLayoutをmergeとincludeで動作させる方法とは?

2022-09-26 03:19:05

質問

私は数日前から、レイアウトをより効率的にするために、何段階ものネストした LinearLayouts を 1 つの RelativeLayout に変更したところ、いくつかの問題に遭遇し、その回避策を見つけることができませんでした。

Android beginners group やこのサイトを検索しましたが、問題を解決するのに役立つものを見つけることができませんでした。

あるブログで、merge と include タグを使用してレイアウトを組み合わせることができると読みました。そこで、私が持っているのは、メイン レイアウト ファイルに RelativeLayout ルート要素があります。 その中に5つのincludeタグがあり、それぞれルートにマージ要素を持つ5つの異なるxmlレイアウトファイルを参照しています(私のマージファイルはすべて、その中のIDを除いて同じものです)。

レイアウト コードの簡略版を投稿した後で説明しますが、2 つの問題に遭遇しています。

サンプル メイン レイアウト ファイル。

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:background="@drawable/translucent_gray" >

    <include 
        android:id="@+id/running_gallery_layout_id"
        layout="@layout/running_gallery_layout" />

    <include 
        android:id="@+id/recent_gallery_layout_id" 
        layout="@layout/recent_gallery_layout"
        android:layout_below="@id/running_gallery_layout_id" />

    <include
        android:id="@+id/service_gallery_layout_id"
        layout="@layout/service_gallery_layout"
        android:layout_below="@id/recent_gallery_layout_id" />

    <include
        android:id="@+id/process_gallery_layout_id"
        layout="@layout/process_gallery_layout"
        android:layout_below="@id/service_gallery_layout_id" />

</RelativeLayout>

同梱のマージファイルのサンプルです。

<?xml version="1.0" encoding="utf-8"?>
<merge xmlns:android="http://schemas.android.com/apk/res/android">
    <TextView 
        style="@style/TitleText"
        android:id="@+id/service_gallery_title_text_id"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:gravity="left"
        android:text="@string/service_title" />

    <Gallery
        android:id="@+id/service_gallery_id"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:layout_below="@id/service_gallery_title_text_id" />

    <TextView 
        style="@style/SubTitleText"
        android:id="@+id/service_gallery_current_text_id"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_toRightOf="@id/service_gallery_title_text_id"
        android:layout_above="@id/service_gallery_id" />
</merge>

私は2つの問題に遭遇しています。

1)その android:layout_* 属性は、includeタグで使用すると無視されるようで、マージされたレイアウトがすべて重なって表示されます。 この投稿によると、( http://developer.android.com/resources/articles/layout-tricks-reuse.html ) "任意の android:layout_* 属性は <include /> タグと併用することができます。

2) これがうまくいかなかったので、今度は android:layout_below 属性を最初の TextView 属性を追加しました。つまり、各マージファイルは別のマージ レイアウト ファイルから ID を参照することになります...。ほとんどの場合、これは実際に機能し、私のレイアウトは正常に見えます。 しかし、ある項目でエラーが発生しました。 android:layout_below 属性の1つで、私が指定したidが見つからないというエラーが発生しました... 私は、idが正しいことを確認するために、二重三重にチェックしました。 最も奇妙なのは、私が AutoFill 機能を使用して、最初の場所で属性に id を配置したことです。

どなたか提案や回避策をお持ちでしたら、ぜひ試してみてください。 また、5 つのマージ xml レイアウト ファイルの代わりに 1 つのマージ xml レイアウト ファイルを作成する方法をご存知の方がいらっしゃいましたら、ぜひ教えてください。 実行時にマージ レイアウト ファイル内の各項目にアクセスする必要があるため、そのような方法を見つけることができませんでした。

どのように解決するのですか?

includeタグに問題があります。確認してください。 https://issuetracker.google.com/issues/36908001

この問題を解決するために、必ず両方の layout_widthlayout_height を含む場合、それ以外の場合はすべて無視されます。