花门楼前见秋草,岂能贫贱相看老。这篇文章主要讲述Android - 任何Activity的根视图层次结构中存在的所有视图的相对路径生成器相关的知识,希望能为你提供帮助。
背景
在android布局文件中还有很多UI元素和视图组。有时我们不需要为视图提供id
值(唯一标识符)。在这种情况下,我们无法通过说findViewByid()
找到视图。因此我们无法操纵它们。
问题是
我们如何为任何活动的所有视图生成路径,示例如下:
content>
LinearLayout-0>
RelativeLayout-3>
LinearLayout-0>
TextView-2
上述行的含义是
- 内容是主要布局
- LinearLayout是最顶层的布局
- RelativeLayout-3是最顶层布局的第3个孩子
- LinearLayout是3rd RelativeLayout的子代
- 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。
推荐阅读
- 如何在Android上一次性获取所有按钮ID
- 在Android Studio中将Gradle从3.3升级到4.1后出错
- PC和Android设备之间的客户端 - 服务器连接问题
- Android Alpha内部版本无法登录。我在哪里可以查看日志文件()
- 如何在Android Studio中的模拟器上安装apk()
- windows7 64位官方旗舰版系统推荐
- 系统之家win7纯净版64位ghost系统免费下载
- 系统之家纯净版win7 32位最新系统免费下载
- ghost win7 32位精简版最新系统免费下载