【android】view.getRootView()的真正含义及测试

view.getRootView()的官方解释就是:Finds the topmost view in the current view hierarchy.寻找当前的view层次中处在最顶层的view

我的理解就是找出该view实例所在的view层次的根view。


为证实这个view.getRootView()的真正含义,下面我做了测试:

activity_main.xml:

<AbsoluteLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
  	<include 
      layout="@layout/test_layout"/>
</AbsoluteLayout>

test_layout.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >
    <RelativeLayout 
        android:layout_width="wrap_content"
        android:layout_height="wrap_content">
        <Button    
            android:id="@+id/testBtn"
	   		android:layout_width="match_parent"
	   		android:layout_height="wrap_content"/>
    </RelativeLayout>
</LinearLayout>

MainActivity.java:

public class MainActivity extends Activity {

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);

		Button testBtn = (Button) findViewById(R.id.testBtn);
		Log.i("testBtn", testBtn.toString()+"  id:"+testBtn.getId());
		Log.i("testBtn's RootView",testBtn.getRootView().toString()+"  id:"+testBtn.getRootView().getId());
		
		View testView =LayoutInflater.from(this).inflate(R.layout.test_layout, null);
		Button testBtn2 = (Button) testView.findViewById(R.id.testBtn);
		Log.i("testBtn2", testBtn2.toString()+"  id:"+testBtn2.getId());
		Log.i("testBtn2's RootView",testBtn2.getRootView().toString()+"  id:"+testBtn2.getRootView().getId());
		
		View decorView = getWindow().getDecorView();
		View contentView =decorView.findViewById(android.R.id.content);
		View mainRootView =((ViewGroup) contentView).getChildAt(0);
		Log.i("decorView", decorView.toString()+"  id:"+decorView.getId());
		Log.i("contentView", contentView.toString()+"  id:"+contentView.getId());
		Log.i("mainRootView",mainRootView.toString()+"  id:"+mainRootView.getId());
	}
}

打印结果:



从打印结果我们需要注意的是testBtn、testBtn2虽然id相同,但却是不同的实例,它们所在的view层次也不一样,因此它们通过getRootView得到的根view是不一样的。


最后我们可以看出来,要想获得当前界面所用的xml文件的根view,就可以用

View rootView = ((ViewGroup) (getWindow().getDecorView().findViewById(android.R.id.content))).getChildAt(0);

来获取。

### 回答1: 在 SystemUI 中,可以通过 `getWindow().getDecorView().getRootView()` 方法获取当前 Window 的根 View,也就是 DecorView。具体代码如下: ```java View decorView = getWindow().getDecorView().getRootView(); ``` 这个方法实际上是从当前的 Window 对象中获取 DecorView,然后再从 DecorView 中获取根 View。DecorView 是整个 Window 的最顶层 View,是所有 View 的祖先,而根 View 则是 DecorView 中第一个被添加的子 View。 在 SystemUI 中,通常会将状态栏、导航栏等系统界面元素添加到 DecorView 中,因此通过 `getWindow().getDecorView().getRootView()` 方法可以获取到整个系统界面的根 View。 需要注意的是,由于 SystemUI 是 Android 系统的一部分,它的权限非常高,因此只有系统权限的应用程序才能够调用 `getWindow().getDecorView().getRootView()` 方法。如果在普通的应用程序中尝试调用这个方法,会抛出 SecurityException 异常。 ### 回答2: systemui是一个用于提供用户界面的系统级应用程序。可以通过getWindow().getDecorView().getRootView()方法来获取系统UI的根视图。具体来说,getWindow()方法是用于获取当前活动的窗口对象,而getDecorView()方法则返回窗口的DecorView,即Activity的根视图。getRootView()方法则返回DecorView的子视图中的根视图。 通过获取系统UI的根视图,可以访问和操作UI中的各种元素,比如布局中的控件、菜单、标题栏等。可以通过给根视图添加监听器、修改视图属性、处理用户输入等方式,实现对系统UI的自定义和交互。 此外,getRootView()方法还可以用于获取当前视图层次中的顶层视图,因此可以用来快速查找视图结构中的任意视图,方便进行UI操作和数据处理。 总之,通过getWindow().getDecorView().getRootView()方法,可以方便地获取系统UI的根视图,并为之后的UI处理和交互提供便利。 ### 回答3: systemui.getWindow().getDecorView().getRootView() 是一个常见的Android代码片段。它通常用于获取应用程序的根视图,并用于进行视图的操作和修改。 在这个代码中,systemui代表一个System UI对象的实例。getWindow()方法用于获取当前应用程序的窗口对象。getDecorView()方法返回窗口的装饰视图,也就是应用程序根视图的根视图。而getRootView()方法则返回整个布局树的根视图。 通过调用这个方法,开发者可以获取到应用程序的根视图,然后进行一些布局、样式或其他相关的操作。比如,可以调用根视图的findViewById()方法来查找子视图,并对其进行操作或设置监听器。也可以调用根视图的setVisibility()方法来显示或隐藏整个布局。 此外,getRootView()方法还可以用于获取根视图的宽度和高度,以及一些其他属性。开发者可以根据需要,灵活运用这个方法,来实现一些自定义的布局和界面效果。 总之,systemui.getWindow().getDecorView().getRootView() 是一个用于获取应用程序根视图的常用代码片段,开发者可以根据实际需求使用它进行布局和视图操作。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值