Android - Относительный генератор путей для всех представлений, присутствующих внутри иерархии rootview любой активности
Фон
В файле компоновки android есть или много элементов пользовательского интерфейса и группы просмотра. Иногда нам не нужно указывать значение id
(уникальный идентификатор) на представления. В таких сценариях мы не можем найти представление, сказав findViewByid()
. поэтому мы не можем ими манипулировать.
Вопрос
Как мы можем создать путь для любого вида любой активности, Пример ниже:
content>LinearLayout-0>RelativeLayout-3>LinearLayout-0>TextView-2
Значение строки выше
- Содержимое является основным макетом
- LinearLayoutis top most layout
- RelativeLayout-3 - 3-й ребенок верхнего расположения макета.
- LinearLayout является дочерним элементом третьего RelativeLayout
- TexView-2 является дочерним элементом LinearLayout, который является третьим дочерним элементом RelativeLayout самого верхнего LinearLayout.
Итак, в основном я ищу функцию, как показано ниже:
String path = getViewPath(view);
и
View view = findViewByPath(path)
Случай использования:
На самом деле сервер будет транслировать некоторую команду в мобильное приложение путем указания пути просмотра,
тогда мобильное приложение найдет представление из пути и изменит свойство представлений
Ответы
Ответ 1
Я думаю, что самым простым решением для этого было бы использовать ViewGroup
getChildAt() и getChildCount().
Итак, вы можете отбросить каждый из ваших желаемых View
как ViewGroup
и вызывать вышеупомянутые методы. Хотя это не вернет путь String
. Но вы все равно можете получить относительную иерархию и проделать свой путь до вашего конкретного варианта использования.
Ответ 2
Нет необходимости изобретать велосипед. Если вам нужна ссылка на ваши представления, есть много способов получить, чем создать путь к представлениям. Если вы хотите, чтобы ссылка из "Представлений" вот что делать:
Из Xml:
Если ваши представления были сделаны с помощью XML
, то лучший способ обратиться к этим View
- это установить id как:
android:id="@+id/my_id"
И если вы хотите обратиться к этому View
в коде, мы используем:
(AnyParentOfTheView).findViewById(R.id.my_id);
Из кода (динамически):
Если ваши представления были созданы динамически, мы не сможем использовать метод (Parent).findViewById(int id)
.
В качестве альтернативы
При динамическом создании представлений мы можем ссылаться на них, используя те, которые мы называем тегами. В отличие от идентификаторов, теги устанавливаются в коде динамически. Тег может быть любым Java Object
, но мы обычно используем Strings, но вы можете связать тег с любым Object
и позже ссылаться на представление, используя метод findViewWithTag(Object tag)
Пример:
.......
TextView myTextView=new TextView(this);
myTextView.setTag("txt");
.......
И когда мы хотим обратиться к нашему TextView
в коде, мы вызываем метод:
TextView myTextView=(TextView)findViewWithTag("txt");
И так мы получаем ссылку на наш View
, поэтому, если вы хотите TextView
, вы можете это сделать. Класс View
даже поддерживает способ получения тега вида в коде, например:
String myTag=myTextView.getTag();
Лучшие методы для вашего случая использования:
setTag(Object obj)
setTag (int key, Object tag)
getTag(int key)
getTag()
findViewWithTag()
Чтобы получить дополнительную документацию и подробную информацию об использовании этих методов и многое другое. Проверьте документацию
ЗДЕСЬ
Ответ 3
Возможно, я слишком упрощен, но похоже, что вы хотите DOM.
Используя это, вы сможете найти всех детей и их пути и запросить структуру.
Если это действительно соответствует вашему требованию, вы можете использовать этот или как предлагается в другом ответе, используя функции ViewGroup, создающие свой собственный объект DOM из корневого представления (вы будет использовать get root и получить детей.