动态获取应用的视图实际大小

本文详细介绍了在Android应用中如何通过简单的代码获取布局的实际大小和屏幕的完整尺寸,包括标题栏和状态栏的高度。通过在onCreate()方法中添加特定的代码段,确保在屏幕旋转等情况下也能准确获取所需信息。此外,文章还提供了关键信息的输出示例,帮助开发者更好地理解和应用这一技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  很多次,我们想要动态地设置我们的布局大小。因此,我们需要在界面进行显示之前获取屏幕的大小,例如在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,可以把这些代码添加为类的静态方法,并进行调用。


Android获取屏幕高度、标题高度、状态栏高度详解

http://www.cnblogs.com/lxshanye/p/3472320.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值