Android - 任何活动

时间:2017-09-15 09:46:28

标签: android android-layout

背景

在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子项。
  6. 所以基本上我正在寻找下面的功能:

    String path = getViewPath(view);
    

    View view = findViewByPath(path)
    

    使用案例

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

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

3 个答案:

答案 0 :(得分:0)

我认为最简单的解决方案是使用ViewGroup的{​​{3}}和getChildAt()方法。

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

答案 1 :(得分:0)

没有必要重新发明轮子。如果您需要对视图的引用,那么有很多方法可以获得视图的路径。如果您希望此处的“视图”中的引用是该做什么:

来自Xml:

如果您的观点是使用XML制作的,那么引用这些View的最佳方法是设置如下ID:

    android:id="@+id/my_id"

如果您想在我们使用的代码中引用View

    (AnyParentOfTheView).findViewById(R.id.my_id);

从代码(动态):

如果您的视图是动态创建的,那么我们就无法使用方法(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

答案 2 :(得分:0)

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

如果这确实符合您的要求,那么您可以使用this或类似的建议,使用ViewGroup函数从根视图构建您自己的DOM对象(您将使用get root和{{ 3}}