Android XML: установите идентификатор ресурса как тег представления в файле макета XML

Я хочу указать связь между двумя представлениями в моем файле макета Android XML. Вот что я хочу сделать:

 <View
      android:id="@+id/pathview"
      android:layout_width="match_parent"
      android:layout_height="match_parent" />
  ...
  <CheckBox
      android:id="@+id/viewPath"
      android:layout_width="match_parent"
      android:layout_height="wrap_content"
      android:checked="true"
      android:paddingRight="7dp"
      android:shadowColor="#000000"
      android:shadowDx="0.5"
      android:shadowDy="0.5"
      android:shadowRadius="0.5"
      android:tag="@id/pathview"
      android:text="Paths" />

Однако анализатор XML обрабатывает тег как строку и не интерпретирует его как целое число (System.out.println((String) [viewPath].getTag()); печатает "ложь"). Можно ли как-то назначить идентификатор ресурса тегу просмотра?

2 ответа

Если вы используете

android:tag="?id/pathview" 

Вы получите идентификатор строки в виде десятичного целого числа с префиксом вопросительного знака. Я не могу найти документацию для этого поведения, но оно кажется достаточно стабильным. То, что вы делаете, запрашивает идентификатор текущей темы. Почему результирующая строка имеет префикс "?" неизвестно

Например:

Учитывая некоторый идентификатор,

public static final int test_id=0x7f080012;

делать,

android:tag="?id/test_id"

приведет к значению тега:

"?2131230738"

Затем вы можете сделать:

 View otherView = activity.findViewById(
    Integer.parseInt(
        someView.getTag().toString().substring(1)
    )
 );

Конечно, вы захотите проверить тег на null и поймать NumberFormatException, если вы пишете более обобщенную логику.

Вы можете установить строку идентификатора в качестве тега, а затем получить идентификатор.

некоторые как:

<View
  android:id="@+id/pathview"
  android:layout_width="match_parent"
  android:layout_height="match_parent" />
...
<CheckBox
  android:id="@+id/viewPath"
  android:layout_width="match_parent"
  android:layout_height="wrap_content"
  android:checked="true"
  android:paddingRight="7dp"
  android:shadowColor="#000000"
  android:shadowDx="0.5"
  android:shadowDy="0.5"
  android:shadowRadius="0.5"
  android:tag="pathview"
  android:text="Paths" />

Тогда в вашем коде:

CheckBox viewPath = findViewById(R.id.pathview);
String pathViewStrId = (String) viewPath.getTag();
int patViewId = getResources().getIdentifier(pathViewStrId, "id", getPackageName());
View pathView = findViewById(patViewId);
Другие вопросы по тегам