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 и получить детей.