125

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

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

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

誰でも私の問題を手伝ってもらえますか?

4

11 に答える 11

306

で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);

そのアプローチを使用して、あなたはあなたが持っているどんなインクルードのどんなフィールドにもアクセスすることができます。

于 2010-09-22T17:36:11.020 に答える
66

<merge>インクルード レイアウトでタグを使用している場合、インクルードの ID は実際のビューではないマージ タグに転送されることがわかりました。

したがって、マージを削除するか、何らかのレイアウトに置き換えてください。

Tor Norbyeは次のように書いています。

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

于 2014-01-13T08:57:49.380 に答える
40

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

<include android:id="@+id/cell1" layout="@layout/workspace_screen" />
于 2009-11-19T00:01:56.897 に答える
4

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

test test1View = (test)findViewById(R.id.test1);
于 2012-02-08T14:44:52.047 に答える
2
  1. include タグごとに id を設定する必要があります
  2. 含まれる子要素は新しい ID を設定します。新しい ID を生成する方法を確認する場合は、次のエントリを参照してください: https://stackoverflow.com/a/15442898/1136117
于 2015-10-13T12:13:10.667 に答える
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"/>
于 2016-08-12T18:17:47.337 に答える
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 を持つ要素を選択する必要があります。

于 2016-11-23T17:29:41.127 に答える