Как указать идентификатор, когда использование включает в XML файл макета
В моем XML файле layout я включил другой XML файл макета (каждый
с другим идентификатором android).
<include layout="@layout/view_contact_name" android:id="+id/test1"/>
<include layout="@layout/view_contact_name" android:id="+id/test2"/>
Но когда я запускаю его в эмуляторе и запускаю Hierarchy Viewer, каждый из
в макете показывается "NO_ID", и в моем коде у меня есть
findViewById(R.id.test1)
и findViewById(R.id.test2)
оба возвращают null.
Кто-нибудь может помочь мне с моей проблемой?
Ответы
Ответ 1
Укажите идентификатор в <include>
<include layout="@layout/test" android:id="@+id/test1" />
Затем используйте два findViewById
для доступа к полям в макете
View test1View = findViewById(R.id.test1);
TextView test1TextView = (TextView) test1View.findViewById(R.id.text);
Используя этот подход, вы можете получить доступ к любому полю в любом из доступных вам.
Ответ 2
Я узнал, что если вы используете тег <merge>
в своем макете include, тогда идентификатор включает передачи тега слияния, который не является реальным видом.
Итак, либо удалите слияние, либо замените его на какой-то макет.
Tor Norbye написал:
Тег <include>
не является реальным видом, поэтому findByView его не найдет. Атрибут @id (и любые другие атрибуты, которые вы установили в теге include) затем применяется к корневому тегу включенного макета. Таким образом, ваш activity.getView(R.id.included1) должен быть фактически <TextView>
.
Ответ 3
Romain Guy указывает, что вы можете переопределить идентификатор включенного макета, поместив атрибут android:id
внутри тега <include>
.
<include android:id="@+id/cell1" layout="@layout/workspace_screen" />
Ответ 4
Я думаю, что главный ответ пропускает самый важный момент и может ввести людей в заблуждение, думая, что тег <include/>
создает представление, содержащее содержимое include.
Ключевым моментом является то, что включение id передается в корневой вид файла компоновки include.
Значит, что это:
// 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"
/>
Становится следующим:
// activity_main.xml
<ImageView
android:id="@+id/someid"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
Ответ 5
да, это так, но осторожно, когда макет, вставленный в поле include, является настраиваемым, и вы хотите получить доступ к этому корневому макету. Этот макет в этом случае @layout/test test фактически возвращается в первой строке.
test test1View = (test)findViewById(R.id.test1);
Ответ 6
Проблема заключается в том, что мы пытаемся использовать id, который не объявлен в текущем файле макета.
Вместо объявления снова id можно просто передать с помощью @+id/
. Если вы реорганизовываете исходное имя идентификатора через Android Studio, он также выполняет рефакторинг в включенном макете.
<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"/>
Ответ 7
- вы должны установить id каждый тег include
- включен дочерний элемент set a новый идентификатор. если вы посмотрите, как создать новый идентификатор, посмотрите на эту запись: fooobar.com/questions/28123/...
Ответ 8
В случае использования <RecyclerView>
найдите идентификатор <include>
с помощью экземпляра раздутого представления, иначе он вернет null.
public class ViewHolder extends RecyclerView.ViewHolder {
private mTextView;
public ViewHolder(View view) {
super(view);
View include_1 = view.findViewById(R.id.include_1);
mTextView = (TextView) include_1.findViewById(R.id.text_id);
}
}
Ответ 9
Говоря о включении, вы либо имеете идентификатор в корневом представлении внутри включенного файла макета, либо в строке включения, а не на обоих. Например:
<include layout="@layout/layout1" android:id="@+id/layout1"/>
Макет 1 файл
<RelativeLayout
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/layout2">
</RelativeLayout>
Приведенный выше пример неверен, потому что технически у вас есть два id, объявленных для одного макета. Итак, вам нужно выбрать, какой элемент будет иметь идентификатор.
Ответ 10
сравнить
<include layout="@layout/view_contact_name" android:id="+id/test1"/>
<include layout="@layout/view_contact_name" android:id="+id/test2"/>
с
<include layout="@layout/view_contact_name" android:id="@+id/test1"/>
<include layout="@layout/view_contact_name" android:id="@+id/test2"/>
являются R.id.test1
и R.id.test2
сгенерированы?