So geben Sie die ID an, wenn die Verwendung in der Layout-XML-Datei enthalten ist

Lesezeit: 4 Minuten

Benutzer-Avatar
hap497

In meiner Layout-XML-Datei habe ich eine andere Layout-XML-Datei (jede mit einer anderen Android-ID) eingefügt.

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

Aber wenn ich es im Emulator ausführe und den Hierarchy Viewer starte, zeigt jedes Layout immer noch ‘NO_ID’ an, und in meinem Code habe ich
findViewById(R.id.test1) und findViewById(R.id.test2) beide geben null zurück.

Kann mir bitte jemand bei meinem Problem helfen?

  • Ihre Ausweise fehlen @ Symbol.

    – AutonomeApps

    8. Februar 2017 um 18:33 Uhr

Benutzer-Avatar
Ron Romero

Geben Sie die ID in der an <include>

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

Verwenden Sie dann zwei findViewById um auf Felder im Layout zuzugreifen

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

Mit diesem Ansatz können Sie auf jedes Feld in jedem Include zugreifen, das Sie haben.

  • Diese Methode gibt mir einen Nullwert für das test1View-Objekt zurück.

    – Nirav Schah

    24. Dezember 2012 um 14:25 Uhr

  • Ich sehe den Unterschied nicht wirklich, kannst du das erklären?

    – Goddchen

    19. Juni 2013 um 19:02 Uhr

  • Ich habe herausgefunden, dass dies nicht hilft, wenn das Layout, das wir enthalten, Merge verwendet. Aber wenn Zusammenführen nicht verwendet wird, funktioniert dies.

    – Zlatko

    29. Juli 2013 um 12:20 Uhr

  • @Zlatko Ja, und das kann nicht funktionieren merge sogar in der Theorie, weil das Ergebnis der Aufnahme von a merge ist nicht eine einzelne Ansicht, sondern ein Bündel von ihnen. Also ist es in Ordnung.

    – Anzeigename

    6. Februar 2014 um 15:47 Uhr

  • Dies funktioniert nur, wenn Merge nicht verwendet wird. Im Falle einer Zusammenführung ist es wie hier angegeben nicht möglich: code.google.com/p/android/issues/detail?id=36918#c3

    – Zahid Rasheed

    30. Oktober 2017 um 17:35 Uhr

Benutzer-Avatar
loki19

Ich habe herausgefunden, dass, wenn Sie verwenden <merge> -Tag in Ihrem Include-Layout, dann wird die ID des Include-Tags an das Merge-Tag übertragen, das keine echte Ansicht ist.

Entfernen Sie also entweder die Zusammenführung oder ersetzen Sie sie durch ein Layout.

Tor Norbye schrieb:

Das <include> tag ist keine echte Ansicht, also wird findByView es nicht finden. Das Attribut @id (und alle anderen Attribute, die Sie für das Include-Tag festgelegt haben) wird stattdessen auf das Stamm-Tag des eingeschlossenen Layouts angewendet. Ihre activity.getView(R.id.included1) sollte also tatsächlich die sein <TextView> selbst.

  • Gut. Ich entferne das Merge-Tag und es fängt an zu funktionieren, aber meine Frage hier ist, wie wird das Merge-Tag verwendet, wenn ein Layout ohne es funktioniert?

    – Ankur Chaudhary

    24. September 2015 um 4:59 Uhr

Romain Guy zeigt an dass Sie die ID eines enthaltenen Layouts überschreiben können, indem Sie ein setzen android:id Attribut innerhalb der <include> Schild.

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

  • Das ist richtig. Das Root-Element in der eingebundenen Layout-Datei kann über die im ‘include’-Tag angegebene ID referenziert werden (es sei denn, sie ist nicht angegeben).

    – An Herrn

    20. September 2013 um 9:48 Uhr

  • ID in = Root-ID im eingeschlossenen Layout

    – Fadel

    2. Juli 2015 um 2:02 Uhr

  • Es scheint mir, wenn ich zuerst die ID setze (im Include-Tag überschreibt es die ID aus dem enthaltenen Layout, oder?), Ich habe das Include-Tag zunächst ‚@+id/cell1‘ und dann das Layout = ‚ @layout/workspace_screen’ überschreibt die android:id erneut mit der ID des enthaltenen Layouts. Die Antworten von @ Ron Romero machen für mich mehr Sinn.

    – Neon Warge

    13. Dezember 2015 um 13:29 Uhr

Ich denke, die oberste Antwort verfehlt den wichtigsten Punkt und könnte die Leute dazu verleiten, das zu denken <include/> -Tag erstellt eine Ansicht, die den Include-Inhalt enthält.

Der entscheidende Punkt ist, dass Include’s Ich würde ist bestanden zur Stammansicht der Layoutdatei des Include.

Das bedeutet, dass dies:

// 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"
    />

Wird das:

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

yes ist so, aber seien Sie vorsichtig, wenn das in das Include-Feld eingefügte Layout ein benutzerdefiniertes ist und Sie auf dieses Root-Layout zugreifen möchten. Dieses Layout, in diesem Fall @layout/test test, wird tatsächlich in der ersten Zeile zurückgegeben.

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

Benutzer-Avatar
Gemeinschaft

  1. Sie müssen für jedes Include-Tag eine ID festlegen
  2. Eingeschlossenes untergeordnetes Element legt eine neue ID fest. Wenn Sie sehen, wie Sie eine neue ID generieren, sehen Sie sich diesen Eintrag an: https://stackoverflow.com/a/15442898/1136117

Benutzer-Avatar
Prakasch

Das Problem ist, dass wir versuchen, eine ID zu verwenden, die nicht in der aktuellen Layoutdatei deklariert ist. Anstatt erneut zu deklarieren, kann id einfach mit bezogen werden @+id/. Wenn Sie den ursprünglichen ID-Namen über Android Studio umgestalten, wird er auch im enthaltenen Layout umgestaltet.

<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"/>

1335120cookie-checkSo geben Sie die ID an, wenn die Verwendung in der Layout-XML-Datei enthalten ist

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy