最近写ui,遇到要在scroll View中,打开界面后,某子view刚好布满整个屏幕的需要。这时,便涉及控件、屏幕高度及类似信息的获取。
1、Activity界面详解:(图片来源见水印)
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);