findViewById() gibt null für benutzerdefinierte Komponenten in Layout-XML zurück, nicht für andere Komponenten

Lesezeit: 3 Minuten

findViewById gibt null fur benutzerdefinierte Komponenten in Layout XML zuruck nicht
Chris Boyle

Ich habe ein res/layout/main.xml einschließlich dieser Elemente und anderer:

<some.package.MyCustomView android:id="@+id/foo" (some other params) />
<TextView android:id="@+id/boring" (some other params) />

In meiner Aktivität onCreate mache ich das:

setContentView(R.layout.main);
TextView boring = (TextView) findViewById(R.id.boring);
// ...find other elements...
MyCustomView foo = (MyCustomView) findViewById(R.id.foo);
if (foo == null) { Log.d(TAG, "epic fail"); }

Die anderen Elemente werden erfolgreich gefunden, aber foo kommt null zurück. MyCustomView hat einen Konstruktor MyCustomView(Context c, AttributeSet a) und ein Log.d(...) am Ende dieses Konstruktors erscheint erfolgreich in logcat kurz vor dem “epic fail”.

Warum ist foo Null?

Denn im Konstruktor hatte ich super(context) anstatt super(context, attrs).

Es ist sinnvoll, wenn Sie die Attribute wie die ID nicht übergeben, dann hat die Ansicht keine ID und kann daher nicht mit dieser ID gefunden werden. 🙂

  • Auch sollten Sie Zeilen nicht mögen (MyCustomView) foo = findViewById(R.id.foo); Sein MyCustomView foo = (MyCustomView) findViewById(R.id.foo);?

    – Jeremy Logan

    7. November 09 um 12:23 Uhr

  • Hatte das gleiche Problem, in meinem Fall hatte ich das setContentView() vergessen.. XD

    – Der Student

    15. Juli 10 um 20:00 Uhr

  • Auf vogella.com gibt es ein schönes Beispiel dafür: vogella.com/articles/AndroidCustomViews/article.html

    – Wolkenjäger

    7. April 13 um 11:01 Uhr

  • Wenn Sie mehr als einen Konstruktor haben, müssen Sie außerdem alle Ihre super()-Methoden auf die richtige Weise aktualisieren.

    – Gabriel Esteban

    8. Mai 13 um 14:33 Uhr

  • Ich bekam einen Herzinfarkt, als ich sah, wie das gute ‘ol findViewById() null zurückgab … Sie haben meine Zeit gespart! Danke!

    – GiveEmTheBoot

    10. März 14 um 20:45 Uhr

findViewById gibt null fur benutzerdefinierte Komponenten in Layout XML zuruck nicht
Alexander Koroltschuk

Ich hatte das gleiche Problem, weil ich in meiner benutzerdefinierten Ansicht den Konstruktor überschrieben habe, aber den Superkonstruktor ohne aufgerufen habe attrs Parameter. (Das war ein Copy/Paste-Fehler.)

Meine vorherige Konstruktorversion:

public TabsAndFilterRelativeLayout(Context context, AttributeSet attrs) {
    super(context);
}

Jetzt habe ich:

public TabsAndFilterRelativeLayout(Context context, AttributeSet attrs) {
    super(context, attrs);
}

Und das funktioniert!

Ich hatte das gleiche Problem. Mein Fehler war folgender: Ich habe geschrieben

        LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        View layout=inflater.inflate(R.layout.dlg_show_info, null);
        alertDlgShowInfo.setView(layout);
        TableRow trowDesc=(TableRow)findViewById(R.id.trowDesc);

und da ich einen Inflater verwendet habe, um die Ansicht aus einer XML-Datei zu “laden”, war die letzte Zeile falsch. Um es zu lösen, musste ich schreiben:

TableRow trowDesc=(TableRow)layout.findViewById(R.id.trowDesc);

Ich habe meine Lösung geschrieben, falls jemand das gleiche Problem hat.

Scheint verschiedene Gründe zu haben. Ich habe gerade “Clean …” in Eclipse verwendet, um ein ähnliches Problem zu lösen. (FindViewByID hatte zuvor funktioniert und fing aus irgendeinem Grund an, null zurückzugeben.)

Gleiches Problem, aber andere Lösung: Ich habe nicht angerufen

setContentView(R.layout.main)

BEVOR ich versucht habe, die Ansicht wie angegeben zu finden Hier

  • Ich denke, dies ist die Lösung, wenn Sie ein Element in einer anderen Ansicht anstelle der aktuellen verwandten Ansicht erhalten.

    – StarCub

    3. April 12 um 5:40 Uhr

findViewById gibt null fur benutzerdefinierte Komponenten in Layout XML zuruck nicht
MQ

Wenn Sie mehrere Layoutversionen haben (je nach Bildschirmdichte, SDK-Versionen), stellen Sie sicher, dass alle das gesuchte Element enthalten.

  • Ich denke, dies ist die Lösung, wenn Sie ein Element in einer anderen Ansicht anstelle der aktuellen verwandten Ansicht erhalten.

    – StarCub

    3. April 12 um 5:40 Uhr

1642329668 446 findViewById gibt null fur benutzerdefinierte Komponenten in Layout XML zuruck nicht
gerfmarquez

In meinem Fall gab findViewById null zurück, weil meine benutzerdefinierte Ansicht im Haupt-XML ungefähr so ​​aussah:

        <com.gerfmarquez.seekbar.VerticalSeekBar  
            android:id="@+id/verticalSeekBar"
            android:layout_width="wrap_content" 
            android:layout_height="fill_parent" 
            />

und ich fand heraus, dass es so funktionierte, als ich das xmlns-Zeug hinzufügte:

        <com.gerfmarquez.seekbar.VerticalSeekBar  
            xmlns:android="http://schemas.android.com/apk/res/android"
            android:id="@+id/verticalSeekBar"
            android:layout_width="wrap_content" 
            android:layout_height="fill_parent" 
            />

.

504360cookie-checkfindViewById() gibt null für benutzerdefinierte Komponenten in Layout-XML zurück, nicht für andere Komponenten

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

Privacy policy