56

私は次のようなインクルードを持っています:

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

インクルードレイアウトは(test.xml)のようになります。

<?xml version="1.0" encoding="utf-8"?>

<FrameLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/outer"
    ... >

    <ImageView
        android:id="@+id/inner"
        ... />
</FrameLayout>

実行時にid="inner"の内部ImageViewが見つからないようです。

ImageView iv = (ImageView)findViewById(R.id.inner);
if (iv == null) {
    Log.e(TAG, "Not found!");
}

私はそれを見つけることができるべきですか?「include」を使用しているため、通常のfindViewByIdメソッドは機能しないようです。

- - - - - アップデート - - - - - - - -

したがって、インクルードに割り当てられたIDを見つけることができます。

View view = findViewById(R.id.placeHolder); // ok

しかし、次のようなIDでその子を見つけることができません。

view.findViewById(R.id.outer); // nope
view.findViewById(R.id.inner); // nope

次のように直接検索してみると、オリジナルと同じです。

findViewById(R.id.outer); // nope
findViewById(R.id.inner); // nope

IDは、実行時に要素から削除されるだけですか?

ありがとう

4

9 に答える 9

94

<include />を取得して、その中を検索してみてください

ルートが、含まれているXMLファイルのルート要素と同じIDを持っていることを確認してください。ex

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

次に、以下を使用して「内部」コンテンツを取得します。

FrameLayout outer = (FrameLayout)findViewById(R.id.outer);

ImageView iv = (ImageView)outer.findViewById(R.id.inner);
if (iv == null) {
    Log.e(TAG, "Not found!");
}
于 2012-05-29T17:15:16.913 に答える
18

将来のGoogle社員のためにこれに追加したかったのですが、findViewById()を呼び出したときに含まれているxml(この場合はouter)のルートレイアウトがnullであるという逆の問題がありましたが、outerの子はnullではありませんでした。

この問題は、include「view」(この場合はplaceHolder)のidプロパティを削除することで解決しました。それがなくなったとき、私は外側を見つけることができましたが、それはidです:)

アイテムにIDを割り当てる必要がある場合はinclude、別のビューグループでラップする方がよいと思います。

于 2015-03-03T15:21:57.580 に答える
1

含まれているレイアウトにIDを付けないでください

<FrameLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    app:layout_constraintTop_toBottomOf="@id/twitterItem"
    android:id="@+id/item1">

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

</FrameLayout>

item_common_layout

<FrameLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    ... >

    <ImageView
        android:id="@+id/inner"
        ... />
</FrameLayout>

今、あなたは内側のビューを見つけることができます:

ImageView iv = (ImageView) view.findViewById(R.id.inner); // works fine!
于 2021-11-05T16:45:07.273 に答える
0

アウターを見つけてparent(それを呼ぼopう)、試してみてくださいop.findViewById()

于 2012-05-29T17:14:25.107 に答える
0

私も同じ問題を抱えていました。次のように、2つのパラメーターを持つ同じ名前の間違った関数を使用していることがわかりました。

public void onCreate(@Nullable Bundle savedInstanceState, @Nullable PersistableBundle persistentState) {
    super.onCreate(savedInstanceState, persistentState);
    setContentView(R.layout.activity_ble_connecting);
    //findViewByid() => wrong
} 

パラメータが1つだけの正しい関数:

    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_ble_connecting);
        //findViewByid() => correct
    }
于 2017-07-28T07:47:55.560 に答える
0

将来の研究者:https ://stackoverflow.com/a/1760010/2790016 IDを追加すると、「実際のレイアウト」の外部タグのIDが上書きされます

ほとんどの制約レイアウトではアイテムを配置するためにIDが必要であるため、includeからIDを削除することは理想的な答えではありません。

于 2018-12-07T22:11:10.273 に答える
0

要素にIDを指定includeし、インクルードされたレイアウトに単一のビューしかない場合(ViewGroup私の場合は)、インクルードされたビューの代わりに要素AdViewのIDを使用します。include

<?xml version="1.0" encoding="utf-8"?>
<!--adview.xml-->
<com.google.android.gms.ads.AdView
        xmlns:ads="http://schemas.android.com/apk/res-auto"
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/adView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:layout_alignParentBottom="true"
        ads:adSize="BANNER"
        ads:adUnitId="@string/admob_banner_id">
</com.google.android.gms.ads.AdView>

activity_main.xml

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

活動中

AdView nullAdView=findViewById(R.id.adView); //this will give null
AdView adView = findViewById(R.id.adsLayout);  //this will be AdView

id要素に与えない場合は、includeviewを使用しても問題ありませんid。また、あなたviewがのViewGroupようなものの中にいるなら、 FrameLayoutviewを使用しても大丈夫idです。

于 2019-01-22T08:06:25.053 に答える
0

私はこの問題に対する答えを見つけました。

この問題は、IncloudIDと最初の内部レイヤーの両方を設定したときに発生します。

私は問題を解決するためにマージを使用しました。

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

とlayout_storiesで

<merge>
<LinearLayout
android:id="@+id/llItem">
 ...
</LinearLayout>
<merge>
于 2020-10-30T09:58:01.173 に答える
0

私はダニエル・ウィルソンの答えに従い、解決策を得ました。同じ画面で同じレイアウトを複数回使用していて、異なるIDを使用してそれらを参照したいと思いました。そのため、includeタグにidを割り当てる代わりに、それらを別のviewGroupでラップし(FrameLayoutを使用)、frameLayoutにIDを付けて内部の子にアクセスしました。それはうまくいきました。例:

私のmain.xmlで:

<!--    ITEM 1-->
<FrameLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    app:layout_constraintTop_toBottomOf="@id/twitterItem"
    android:id="@+id/item1">

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

</FrameLayout>

<!--    ITEM 2-->
<FrameLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    app:layout_constraintTop_toBottomOf="@id/item1"
    android:id="@+id/item2">

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

</FrameLayout>
于 2021-03-15T04:49:53.917 に答える