Android - 任何Activity的根视图层次结构中存在的所有视图的相对路径生成器

花门楼前见秋草,岂能贫贱相看老。这篇文章主要讲述Android - 任何Activity的根视图层次结构中存在的所有视图的相对路径生成器相关的知识,希望能为你提供帮助。
背景
在android布局文件中还有很多UI元素和视图组。有时我们不需要为视图提供id值(唯一标识符)。在这种情况下,我们无法通过说findViewByid()找到视图。因此我们无法操纵它们。
问题是
我们如何为任何活动的所有视图生成路径,示例如下:
content> LinearLayout-0> RelativeLayout-3> LinearLayout-0> TextView-2
上述行的含义是

  1. 内容是主要布局
  2. LinearLayout是最顶层的布局
  3. RelativeLayout-3是最顶层布局的第3个孩子
  4. LinearLayout是3rd RelativeLayout的子代
  5. TexView-2是LinearLayout的子代,它是最顶层LinearLayout的第3个RelativeLayout子代。
所以基本上我正在寻找如下功能:
String path = getViewPath(view);


View view = findViewByPath(path)

使用案例:
实际上,服务器会通过视图路径向移动应用程序广播一些命令,
然后移动应用程序将从路径中找到视图并更改视图的属性
答案我认为最简单的解决方案是使用ViewGroup的getChildAt()和getChildCount()方法。
所以,你可以将你想要的每个View作为ViewGroup投射,并可以调用上述方法。虽然,这不会返回String路径。但是您仍然可以获得相对层次结构,并按照您的具体用例进行操作。
另一答案没有必要重新发明轮子。如果您需要对视图的引用,那么有很多方法可以获得视图的路径。如果您想要来自Views的引用,那么该做什么:
From Xml:
如果您的观点是使用XML制作的,那么引用这些View的最佳方法是设置如下ID:
android:id="@+id/my_id"

当你想在代码中引用View时,我们使用:
(AnyParentOfTheView).findViewById(R.id.my_id);

From Code (Dynamically):
如果您的视图是动态创建的,那么我们就不能使用(Parent).findViewById(int id)方法。
另外
当您动态创建视图时,我们可以使用我们称之为标签的方式来引用它们。与ids不同,标签在代码中动态设置为您的视图。标签可以是任何java Object,但我们通常使用字符串,但您可以将标记与任何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()

获取有关使用这些方法的更多文档和详细说明。查看文档HERE
另一答案也许我过度简化但听起来像你想要的是DOM。使用它,您将能够找到所有孩子及其路径并查询结构。
【Android - 任何Activity的根视图层次结构中存在的所有视图的相对路径生成器】如果确实这回答了你的要求那么你可以使用this或类似的建议在一个不同的答案中使用ViewGroup函数从根视图构建你自己的DOM对象(你将使用get root和get children。

    推荐阅读