レイアウトXMLファイルにインクルードを使用するときにIDを指定する方法


117

私のレイアウトxmlファイルには、他のレイアウトxmlファイルが含まれています(それぞれ異なるAndroid IDが含まれています)。

<include layout="@layout/view_contact_name" android:id="+id/test1"/>
<include layout="@layout/view_contact_name" android:id="+id/test2"/>

しかし、それをエミュレータで実行して階層ビューアを起動すると、各レイアウトにはまだ「NO_ID」が表示され、私のコードでは findViewById(R.id.test1)findViewById(R.id.test2)、両方のリターンをnull。

誰かが私の問題を助けてくれますか?


6
IDに@記号がありません。
AutonomousApps

回答:


288

IDを <include>

<include layout="@layout/test" android:id="@+id/test1" />

次に、2つfindViewByIdを使用してレイアウトのフィールドにアクセスします

View test1View = findViewById(R.id.test1);
TextView test1TextView = (TextView) test1View.findViewById(R.id.text);

このアプローチを使用すると、インクルード内の任意のフィールドにアクセスできます。


18
このメソッドは、test1Viewオブジェクトのnull値を返します。
Nirav Shah、

4
違いはわかりませんが、説明できますか?
Goddchen 2013年

30
私たちが含めたレイアウトがマージを使用している場合、これは役に立たないことがわかりました。しかし、マージが使用されない場合、これは機能します。
Zlatko 2013

@Zlatkoはい、そしてこれはmerge理論的にも機能しません。なぜなら、aを含む結果はmerge単一のビューではなく、それらの束です。だから大丈夫です。
表示名

1
これは、マージが使用されない場合にのみ機能します。マージの場合、ここで指定されているように不可能です:code.google.com/p/android/issues/detail?id
Zahid Rasheed

61

あなたが使っているなら <merge>インクルードレイアウトでタグを、インクルードのIDが実際のビューではないマージタグに転送される。

したがって、マージを削除するか、レイアウトに置き換えます。

Tor Norbyeが書いた

<include>タグは、実際のビューではありませんので、findByViewはそれを見つけることができません。代わりに、@ id属性(およびincludeタグに設定したその他の属性)が、含まれているレイアウトのルートタグに適用されます。したがって、あなたのactivity.getView(R.id.included1)は実際には<TextView>それ自体である必要があります。


3
いいね。マージタグを削除すると機能し始めますが、ここでの質問は、それなしで機能するインクルードレイアウトがある場合のマージタグの使い方は何ですか?
Ankur Chaudhary 2015

35

Romain Guy android:id<include>タグ内に属性を配置することで、含まれているレイアウトのIDを上書きできることを示しています。

<include android:id="@+id/cell1" layout="@layout/workspace_screen" />

1
これは正しいです。インクルードされたレイアウトファイルのルート要素を参照する方法は、「include」タグで指定されたIDによるものです(指定されていない場合を除く)。
トムR

1
<include>のID =インクルードレイアウトのルートのID
Fadils

最初にIDを設定した場合(インクルードタグでは、インクルードレイアウトのIDをオーバーライドしますよね?) @ layout / workspace_screen 'は、組み込まれたレイアウトのIDでandroid:idを再度オーバーライドします。@Ron Romeroの答えは私にはもっと理にかなっています。
ネオンWarge

14

上の答えは最も重要なポイントを逃しており、<include/>タグがインクルードコンテンツを保持するビューを作成すると考えるように人々を誤解させるかもしれません。

重要な点は、インクルードのID渡されることですインクルードのレイアウトファイルのルートビューにれることです。

これが意味すること:

// activity_main.xml
<include layout="@layout/somelayout" android:id="@+id/someid"/>

// somelayout.xml
<?xml version="1.0" encoding="utf-8"?>
<ImageView
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    />

これになる:

// activity_main.xml
<ImageView
    android:id="@+id/someid"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    />

4

はいはこのようなものですが、includeフィールドに挿入されたレイアウトがカスタムレイアウトであり、そのルートレイアウトにアクセスする場合は注意してください。この場合のレイアウトは@ layout / test testで、実際には最初の行に返されます。

test test1View = (test)findViewById(R.id.test1);


2

問題は、現在のレイアウトファイルで宣言されていないidを使用しようとすることです。再度宣言する代わりに、idはを使用して簡単に参照できます@+id/。Android Studioで元のID名をリファクタリングすると、インクルードレイアウトでもリファクタリングされます。

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

<TextView
    android:id="@+id/txt_description"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    **android:layout_below="@+id/toolbar"**
    android:layout_marginTop="16dp"
    android:paddingLeft="8dp"
    android:paddingRight="8dp"/>

2

使用する場合は<RecyclerView>IDを見つける<include>膨張したビューのインスタンスを使用するか、そうでなければ戻りますヌルを

public class ViewHolder extends RecyclerView.ViewHolder {

        private mTextView;

        public ViewHolder(View view) {
            super(view);
            View include_1 = view.findViewById(R.id.include_1);
            mTextView = (TextView) include_1.findViewById(R.id.text_id);
        }
    }

1

インクルードレイアウトのルートタグのいずれかにIDを設定した場合は、そのIDを使用するか、IDをインクルードレイアウトに設定できます。

ただし、IDを両方に設定することはできず、例外がスローされる場合があります。

<include layout="@layout/view_contact_name" android:id="+id/test1"/>

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

....
</LinearLayout>

または

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

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
        android:id="@+id/llBottomMainView"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

....
</LinearLayout>

0

インクルードについて話すときは、インクルードされたレイアウトファイル内のルートビューまたはインクルード行自体にIDがあり、両方にはありません。例えば:

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

レイアウト1ファイル

<RelativeLayout
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/layout2">

</RelativeLayout>

上記の例は誤りです。技術的には同じレイアウトに対して2つのIDが宣言されているためです。だからあなたがしなければならないことは、どの要素がIDを持つかを選ぶことです。


0

わあ、この質問にはまだ正解がありません。それは単純なタグが吸うです。あなただけで始まるものに変更することができますandroid:layout_どのandroid:id一致していませんが。だから答えはできません。ごめんなさい。代わりにできることは、中に含まれているビューを膨らませるViewGroupになるクラスを作成し、それをレイアウトにタグとして追加することですが、それはそれだけです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.