FindViewById не работает для включения?

У меня есть include include:

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

Макет include выглядит как (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>

Я не могу найти внутренний ImageView с id = "inner" во время выполнения:

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

Должен ли я найти его? Похоже, что при использовании "include" обычный метод findViewById не работает.

---------- Обновление ----------------

Поэтому я могу найти идентификатор, присвоенный include:

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

Может ли идентификаторы просто удаляться из элементов во время выполнения?

Спасибо

Ответ 1

Попробуйте найти <include />, а затем выполните поиск в этом

Убедитесь, что ваш корень имеет тот же ID, что и корневой элемент во включенном XML файле. 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!");
}

Ответ 2

Я просто хотел добавить к этому для будущих Googlers, у меня была противоположная проблема, когда корневая компоновка включенного xml (в данном случае внешнего) была нулевой при вызове findViewById(), но дети внешнего были не null.

Проблема была решена для меня, удалив свойство id в представлении include '(в данном случае placeHolder). Когда это исчезло, я мог найти внешний, но это id:)

Если вам нужен идентификатор, назначенный элементу include, я думаю, что лучше его переносить в другую группу просмотра.

Ответ 3

Можете ли вы попробовать найти внешний родительский объект (позвоните ему "op" ), а затем попробуйте op.findViewById()?

Ответ 4

У меня была та же проблема. Я узнал, что я использовал неправильную функцию с тем же именем с двумя параметрами:

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

правильная функция с только одним параметром:

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

Ответ 5

Будущие исследователи: fooobar.com/questions/65904/... при добавлении к нему идентификатора перезаписывает идентификатор из внешнего тега из "реального макета"

Учитывая, что большинству макетов ограничений нужен идентификатор для позиционирования элементов, удаление идентификатора из include не является идеальным ответом.

Ответ 6

Если вы ViewGroup идентификатор для элемента include и у вас есть только одно представление во включенном макете (не в любой ViewGroup), в моем случае AdView, тогда используйте идентификатор элемента 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 для include элемента, тогда можно использовать представление id. Также, если ваше view находится внутри любой ViewGroup такой как FrameLayout тогда можно использовать id.

Ответ 7

в моем случае, inisialisasi ваше включение должно соответствовать вашему корневому представлению.

в том числе:

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

в виду включают в себя:

  <?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>

в деятельности:

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

    ImageView iv = findViewById(R.id.inner);

поэтому идентификатор в включить заменить идентификатор в корневом представлении включить