为何无法通过View.rootView获取最顶层Relative Layout的ID?
为什么
View.getRootView()无法获取到布局最外层的RelativeLayout? 核心原因
getRootView()返回的不是你自定义布局里的最外层RelativeLayout,而是Android系统为Activity窗口自动创建的顶层视图——DecorView,这个视图的默认ID就是-1,所以你会得到这个结果。
详细解释
根据Android官方文档(翻译):getRootView()方法返回的是当前视图所在整个视图树的根视图。在Activity中,你编写的布局文件会被系统作为子视图,添加到DecorView内部的一个默认容器(通常是ID为android.R.id.content的FrameLayout)中。也就是说,你的视图结构实际是这样的:
- DecorView(ID=-1,系统顶层视图)
- FrameLayout(ID=android.R.id.content,系统容器)
- Relative Layout(id = 1,你的自定义最外层布局)
- Relative Layout(id = 104)
- TextView(id = 200)
- Relative Layout(id = 104)
- Relative Layout(id = 1,你的自定义最外层布局)
- FrameLayout(ID=android.R.id.content,系统容器)
所以你通过v.rootView拿到的是最顶层的DecorView,它本身没有设置ID,自然返回-1;而v.parent.parent则是直接遍历到你自定义布局的最外层RelativeLayout,所以能拿到正确的ID=1。
如何通过视图树获取自定义最外层布局?
如果想通过rootView来获取你的最外层RelativeLayout,可以这样做:
// 获取系统默认的content容器 val contentContainer = v.rootView.findViewById<ViewGroup>(android.R.id.content) // 你的最外层布局是content容器的第一个子View val topRelativeLayout = contentContainer.getChildAt(0) as ViewGroup Log.d("demo", "Top layout ID: ${topRelativeLayout.id}")
内容的提问来源于stack exchange,提问作者Jatin guglani
相关产品推荐
相关产品推荐

