114

LinearLayoutsネストされた複数のレベルを 1 つのレベルに変換することで、レイアウトをより効率的にするために数日間試みてきましRelativeLayoutたが、回避策を見つけることができなかったいくつかの問題に遭遇しました...

Android 初心者グループとこのサイトを検索しましたが、問題の解決に役立つものは見つかりませんでした。

ブログの 1 つで、レイアウトをマージおよびインクルード タグと組み合わせることができると読みました。私が持っているのは、RelativeLayoutルート要素を持つメイン レイアウト ファイルです。その中には、5 つの異なる xml レイアウト ファイルを参照する 5 つの include タグがあり、それぞれがルートのマージ要素を持っています (マージ ファイルはすべて、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 />タグで使用できます」

android:layout_below2) これを機能させることができなかったので、各マージ レイアウト ファイルの最初の項目に属性を追加してみることにしました。これTextViewは、各マージ ファイルが別のマージ レイアウト ファイルの ID を参照していることを意味します。ほとんどの場合、これは実際に機能し、私のレイアウトはうまく見えます。ただし、android:layout_below属性の 1 つで、指定した ID が見つからないというエラーが表示されます... ID を 2 回および 3 回チェックして、ID が正しいことを確認しました。最も奇妙な部分はAutoFill、最初に属性に ID を入れる機能を使用したことです。

誰かに提案や回避策があれば、喜んで試してみます。また、マージ xml レイアウト ファイルを 5 つではなく 1 つにする方法を誰かが考えてくれれば、非常にありがたいです。実行時にマージ レイアウト ファイルの各項目にアクセスする必要があるため、それを行う方法が見つかりませんでした...

4

8 に答える 8

215

include タグに問題があります。チェック: https://issuetracker.google.com/issues/36908001

これを修正するには、必ず BOTH を上書きしてくださいlayout_widthlayout_height含めない場合、すべてが無視されます。

于 2011-06-19T17:54:28.320 に答える
33

以下のより投票数の多い回答を参照してください。私のはひどく時代遅れです


Justinが提起した1 つの問題に対処できます: RelativeLayout でインクルードの配置を管理できない (少なくともこの単純なケースでは、1.6 エミュレーターで)

CommonsWareはインクルードを一意の親コンテナーにラップすることを提案していますが、ジャスティンのインクルード内の同じ名前のビューのアドレス指定とスコープ設定を支援するためにそうしています

それぞれに一意の親コンテナーが必要であり、Activity ではなくそのコンテナー (ViewGroup) で findViewById() を呼び出します。

実際、RelativeLayout を期待どおりに動作させるには、次のようにする必要もあります。

これは機能します(フッターは適切に配置されています):

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent" android:layout_height="fill_parent">
    <include android:id="@+id/header" layout="@layout/header"
        android:layout_alignParentTop="true" />
    <WebView android:id="@+id/webView" android:layout_below="@id/header"
        android:background="#77CC0000" android:layout_height="wrap_content"
        android:layout_width="fill_parent" android:focusable="false" />
    <LinearLayout android:layout_alignParentBottom="true"
        android:layout_height="wrap_content" android:layout_width="fill_parent">
        <include android:id="@+id/footer" layout="@layout/footer" />
    </LinearLayout>
</RelativeLayout>

これはそうではありません(フッターは画面の上部に浮かんでいます):

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent" android:layout_height="fill_parent">
    <include android:id="@+id/header" layout="@layout/header"
        android:layout_alignParentTop="true" />
    <WebView android:id="@+id/webView" android:layout_below="@id/header"
        android:background="#77CC0000" android:layout_height="wrap_content"
        android:layout_width="fill_parent" android:focusable="false" />
    <include android:id="@+id/footer" layout="@layout/footer"
        android:layout_alignParentBottom="true" />
</RelativeLayout>

裸のフッターインクルードは、周囲の LinearLayout がなければ、親の下部に揃えられません。私は、これを予想される動作とは呼びません。

さらに、WebView はID によってヘッダーにうまく接続されているように見えますが、ヘッダーの下を垂直に流れるだけなので、これは錯覚だと思います。また、フッターインクルードのすぐ上にボタンを設定しようとしましたが、すべて浮いて間違っていました

RelativeLayout は 1.5 でさらに多くの問題を抱えていましたが、それでも気に入っています :)

于 2010-03-30T20:27:53.190 に答える
8

おいおい、これは古いけど検索上位に出てきそうだからコメントしとく。

ここでの秘訣は、<merge>タグと組み合わせたタグが<include>、そのレベルでのあらゆる種類の「親」ビュー グループを本質的に削除することだと思います。それでは、正確には誰に「layout_below」を求めているのでしょうか? 誰も。そのレベルのビューはありません。

タグは子<merge>ビューを受け取り、それらをタグの親に直接ポップします<include>。したがって、含めるレイアウト内の子に、それに応じて自分自身を固定するように依頼する必要があります。

于 2012-11-27T22:38:00.200 に答える
4

RelativeLayout で配置を機能させるには、メイン レイアウト ファイルではなく、インクルード ファイルで layout_* パラメータを設定する必要があります。その方法

main_layout.xml

<RelativeLayout
  android:id="@+id/header"
  android:layout_width="fill_parent"
  android:layout_height="wrap_content">
   ....
</RelativeLayout>

<RelativeLayout 
  android:id="@+id/footer"
  android:layout_width="fill_parent"
  android:layout_height="wrap_content"
  android:layout_alignParentBottom="true">
    .....
</RelativeLayout>

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

content_layout.xml

<merge xmlns:android="http://schemas.android.com/apk/res/android">
<RelativeLayout
    android:id="@+id/content"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:layout_above="@id/footer"
    android:layout_below="@id/header" >

    ....
</RelativeLayout>
</merge>

これは明らかに私たち開発者が望んでいるものではありませんが、xml の重複を避けるために私が見つけた唯一の解決策です。

于 2011-11-07T11:08:31.700 に答える
1

include タグで使用すると android:layout_* 属性が無視され、マージされたすべてのレイアウトが互いに重ねて表示されるようです。

android:id私の推測では、レイアウト ルールから、要素に定義されている属性を参照することはできず、<include>「実際の」ウィジェットとコンテナーにある属性のみを参照できます。

また、マージ xml レイアウト ファイルを 5 つではなく 1 つにする方法を誰かが考えてくれれば、非常にありがたいです。

シンプル: すべてを 1 つのファイルにまとめます。

実行時にマージ レイアウト ファイルの各項目にアクセスする必要があるため、それを行う方法が見つかりませんでした。

要素が 1 つであろうと<include>1,000 個であろうと、実行時にすべてのコンテンツにアクセスできる必要があります。1 つの例外は、属性が重複している場合です。ListView の行からウィジェットを取得する場合と同様に、呼び出しをandroid:id適切にスコープして正しいものを取得する必要があります。findViewById()

2 つ以上のマージ ファイルを使用するサンプル プロジェクトを作成して、実行時にコンテンツにアクセスできないことを実証できる場合は、お知らせください。

于 2010-02-23T12:45:34.470 に答える
1

試す :

<RelativeLayout xmlns:tools="http://schemas.android.com/tools"
    xmlns:android="http://schemas.android.com/apk/res/android"
    tools:showIn="@layout/activity_home">
于 2019-11-16T10:44:40.467 に答える