android动态获取控件、屏幕高度等信息的方法

最近写ui,遇到要在scroll View中,打开界面后,某子view刚好布满整个屏幕的需要。这时,便涉及控件、屏幕高度及类似信息的获取。


1、Activity界面详解:(图片来源见水印)

android动态获取控件、屏幕高度等信息的方法_第1张图片

1)屏幕 = 状态栏(Status Bar) + 标题栏(Action Bar)+view界面

2)屏幕 = 状态栏 + 应用界面


2、状态栏高度的获取:共有四种方法

1)通过系统资源获取:

系统资源R文件中,status_bar的高度以status_bar_height存储,但是属性却是private。因此需借助系统提供的帮助类来获取,这里的帮助类是Resource类:

		int statusBarHeight1 = -1;
		//获取status_bar_height资源的ID
		int resourceId = getResources().getIdentifier("status_bar_height", "dimen", "android");
		if (resourceId > 0) {
			//根据资源ID获取响应的尺寸值
			statusBarHeight1 = getResources().getDimensionPixelSize(resourceId);
		}
2)通过R类的反射

虽然不能直接用R中资源,但是可以调用R资源创建实例再获取实例中包含的信息:

		int statusBarHeight2 = -1;
	    try {
	        Class clazz = Class.forName("com.android.internal.R$dimen");
	        Object object = clazz.newInstance();
	        int height = Integer.parseInt(clazz.getField("status_bar_height")
	                .get(object).toString());
	        statusBarHeight2 = getResources().getDimensionPixelSize(height);
	    } catch (Exception e) {
	        e.printStackTrace();
	    }

3)借用应用区域的top属性:

		Rect rectangle= new Rect();
		getWindow().getDecorView().getWindowVisibleDisplayFrame(rectangle);
		//高度为rectangle.top-0仍为rectangle.top
即1.2)的公式。但是此方法是回调方法,依赖于窗口回调机制,onCreate方法中获得的值会是0

4)还是借助应用区域和状态栏的关系

		//屏幕
		DisplayMetrics dm = new DisplayMetrics();
		getWindowManager().getDefaultDisplay().getMetrics(dm);
		//应用区域
		Rect outRect1 = new Rect();
		getWindow().getDecorView().getWindowVisibleDisplayFrame(outRect1);
		int statusBar = dm.heightPixels - outRect1.height();  //状态栏高度=屏幕高度-应用区域高度
道理同方法3),所以效果也是一样。方法三四都是不推荐的。


3、标题栏高度的测量:由于这里我使用的是toolbar,因此android自己就提供了返回高度的方法:

那就是:

toolbar.getLayoutParams().height

4、控件高度的动态设置

虽然在xml等布局文件里,我们能够直接设置布局的大小,但是有时也需要在代码中改变它。代码的实现也很简单:

获取 → 设置

relativeLayout = (RelativeLayout) findViewById(R.id.main_weather);
        ViewGroup.LayoutParams params =  relativeLayout.getLayoutParams();
        DisplayMetrics metric = new DisplayMetrics();
        getWindowManager().getDefaultDisplay().getMetrics(metric);
在我这里,是一个RelativeLayout的布局。


其中第二行的ViewGroup,很多地方写的RelativeLayout.LayoutParams,但是会因此报错,不知道为什么。


这样,所有需要获取的数据都获取了。最后,一个简单的减法,在set一下就大功告成。

params.height = metric.heightPixels - toolbar.getLayoutParams().height - statusBarHeight;
        relativeLayout.setLayoutParams(params);



你可能感兴趣的:(Android学习)