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);
поэтому идентификатор в включить заменить идентификатор в корневом представлении включить