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

问题描述 投票:11回答:3

背景

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

使用案例:

实际上,服务器会通过视图路径向移动应用程序广播一些命令,

然后移动应用程序将从路径中找到视图并更改视图的属性

android android-layout
3个回答
0
投票

我认为最简单的解决方案是使用ViewGroupgetChildAt()getChildCount()方法。

所以,你可以将你想要的每个View作为ViewGroup投射,并可以调用上述方法。虽然,这不会返回String路径。但是您仍然可以获得相对层次结构,并按照您的具体用例进行操作。


0
投票

没有必要重新发明轮子。如果您需要对视图的引用,那么有很多方法可以获得视图的路径。如果您想要来自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


0
投票

也许我过度简化但听起来像你想要的是DOM。使用它,您将能够找到所有孩子及其路径并查询结构。

如果确实这回答了你的要求那么你可以使用this或类似的建议在一个不同的答案中使用ViewGroup函数从根视图构建你自己的DOM对象(你将使用get rootget children

© www.soinside.com 2019 - 2024. All rights reserved.