背景
在android布局文件中还有很多UI元素和视图组。有时我们不需要为视图提供id
值(唯一标识符)。在这种情况下,我们无法通过findViewByid()
来查找视图。因此我们无法操纵它们。
问题
我们如何为任何活动的所有视图生成路径,示例如下:
content>LinearLayout-0>RelativeLayout-3>LinearLayout-0>TextView-2
上述行的含义是
所以基本上我正在寻找下面的功能:
String path = getViewPath(view);
和
View view = findViewByPath(path)
使用案例
实际上,服务器会通过视图路径向移动应用程序广播一些命令,
然后移动应用会从路径中找到视图并更改视图的属性
答案 0 :(得分:0)
我认为最简单的解决方案是使用ViewGroup
的{{3}}和getChildAt()方法。
因此,您可以将所需的View
投射为ViewGroup
,并可以调用上述方法。但是,这不会返回String
路径。但是您仍然可以获得相对层次结构,并按照您的具体用例进行操作。
答案 1 :(得分:0)
没有必要重新发明轮子。如果您需要对视图的引用,那么有很多方法可以获得视图的路径。如果您希望此处的“视图”中的引用是该做什么:
如果您的观点是使用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)