Frage findViewById funktioniert nicht für ein Include?


Ich habe ein Include wie:

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

Das Include-Layout sieht wie folgt aus (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>

Ich kann das innere ImageView mit id = "inner" zur Laufzeit nicht finden:

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

Sollte ich es finden können? Es scheint so, als würde die normale findViewById-Methode nicht funktionieren, da sie ein "include" verwendet.

---------- Aktualisierung ----------------

So kann ich die ID finden, die dem Include zugewiesen ist:

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

aber ich kann keines seiner Kinder nach ID finden wie:

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

genauso wie das Original, wenn ich versuche, direkt nach ihnen zu suchen:

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

Werden IDs zur Laufzeit vielleicht einfach aus Elementen entfernt?

Vielen Dank


31
2018-05-29 17:10


Ursprung


Antworten:


Versuchen Sie, die <include /> und dann darin suchen

Stellen Sie sicher, dass Ihr root die gleiche ID wie das root-Element in der enthaltenen XML-Datei hat. Ex

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

Dann rufen Sie Ihren "inneren" Inhalt ab mit:

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

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

57
2018-05-29 17:15



Ich wollte nur für zukünftige Googler hinzufügen, hatte ich eine Art das umgekehrte Problem, wo das Root-Layout der enthaltenen Xml (in diesem Fall äußere), war Null beim Aufruf findViewById (), aber die Kinder von äußeren waren nicht null.

Das Problem wurde für mich gelöst, indem ich die Id - Eigenschaft der include 'view' (in diesem Fall placeHolder). Als das weg war, konnte ich äußerlich finden, aber es ist id :)

Wenn Sie eine ID benötigen, die dem zugewiesen ist include Item, ich denke, es ist besser, es in eine andere Viewgroup zu wickeln.


10
2018-03-03 15:21



Können Sie versuchen, dann das äußere Elternteil zu finden (nennen wir es 'op') und dann versuchen, op.findViewById ()?


0
2018-05-29 17:14



Ich hatte das gleiche Problem. Ich fand heraus, dass ich eine falsche Funktion mit dem gleichen Namen mit 2 Parametern wie folgt verwendet:

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

richtig Funktion mit nur einem Parameter:

    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_ble_connecting);
        //findViewByid() => correct
    }

0
2017-07-28 07:47