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);