很多次,我们想要动态地设置我们的布局大小。因此,我们需要在界面进行显示之前获取屏幕的大小,例如在onCreate()方法大众。获取屏幕大小和尺寸很简单只需要2行代码,但它不意味着我们应用的布局大小也可以同样的方式获取。
为获取我们布局的实际大小,我们需要知道屏幕大小,标题栏,状态栏。最终从屏幕大小减去标题栏及状态栏的高度的方式获取我们布局的实际大小。XML文件如下:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/mainroot"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical"
android:paddingTop="35dip"
android:paddingBottom="35dip"
android:paddingLeft="35dip"
android:paddingRight="35dip"
android:gravity="center" >
.....
.....
</LinearLayout>
在onCreate,写上
private LinearLayout root;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
root = (LinearLayout) findViewById(R.id.mainroot);
root.post(new Runnable() {
public void run() {
Rect rect = new Rect();
Window win = getWindow(); // Get the Window
win.getDecorView().getWindowVisibleDisplayFrame(rect);
// 获取状态栏高度
int statusBarHeight = rect.top;
// 获取内容的高度
int contentViewTop = win.findViewById(Window.ID_ANDROID_CONTENT).getTop();
// 计算标题栏的高度
int titleBarHeight = contentViewTop - statusBarHeight;
Log.i("MY", "titleHeight = " + titleBarHeight + " statusHeight = " + statusBarHeight + " contentViewTop = " + contentViewTop);
// 现在我们知道了标题栏及状态栏的高度
// 现在可以获取屏幕的大小了
DisplayMetrics metrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(metrics);
int screenHeight = metrics.heightPixels;
int screenWidth = metrics.widthPixels;
Log.i("MY", "Actual Screen Height = " + screenHeight + " Width = " + screenWidth);
// 现在可以计算我们要设置的布局的高度
int layoutHeight = screenHeight - (titleBarHeight + statusBarHeight);
Log.i("MY", "Layout Height = " + layoutHeight);
// 最后设置布局的高度
LayoutParams rootParams = (LayoutParams)root.getLayoutParams();
rootParams.height = layoutHeight;
root.setLayoutParams(rootParams);
}
});
Log.i("MY", "FINISHED OnCreate");
}
输出结果为
04-06 22:21:42.725: I/MY(4765): FINISHED OnCreate
04-06 22:21:42.757: I/MY(4765): titleHeight = 38 statusHeight = 38 contentViewTop = 76
04-06 22:21:42.757: I/MY(4765): Actual Screen Height = 854 Width = 480
04-06 22:21:42.757: I/MY(4765): Layout Height = 778
添加 root.post(Runnable)的原因是:onCreate()方法完成之后,Activity才可以知道Window和Content的大小。因此当 onCreate()执行后,root.post()会执行然后我们可以获取窗口中各个部件的高度。
好处
- onCreate()中添加代码,因此不管屏幕是否旋转,它都会执行,我们都可以获取最后的窗口尺寸。
- 不管屏幕密度,代码可以在所有的密度当中执行。不同的密度有不同大小的标题栏,状态栏及内容视图。
- 不管什么时候布局需要动态的知道它的大小并设置它的子视图的高度,这都是一个最好的选择。
小知识
如果同样的代码使用在不同的Activity,可以把这些代码添加为类的静态方法,并进行调用。