Как указать идентификатор, когда использование включает в 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 сгенерированы?