2012-01-09 89 views
2

请正确地让我在这里:安卓:获取屏幕尺寸为根布局仅

我想获得可用的高度/空间的宽度与活动/布局onCreate()方法来计算高度可以给予儿童布局。我可以使用以下屏幕大小:

 root = (LinearLayout) findViewById(R.id.mainroot); // Main layout of LinearLayout 

     android.view.Display display = getWindowManager().getDefaultDisplay(); 
    int height = Display.getHeight(); // I know this is deprecated have hence used 
     int width = Display.getWidth(); // DisplayMetrics 
    int childWidth, childHeight; 

    DisplayMetrics metrics = new DisplayMetrics(); 
    display.getMetrics(metrics); 
    //int density = metrics.densityDpi; 
    height = metrics.heightPixels; //480 
    width = metrics.widthPixels; //320 

这两种方法/方式都给我相同的高度和宽度,即全屏大小。我正在寻找的是获得实际的高度,这是在扣除应用标题,状态栏等之后的布局。

任何想法如何得到这个。或者获得标题的大小等 - 这里应该统计所有的东西。在模拟器上,我看到顶部有2个条 - 1必须是应用程序标题什么是另一个。我可以获得所有的高度,并从屏幕高度中扣除。

还有一点:在这种情况下,我将按照程序设置高度,因此它将以像素为基础(因为我只能以像素为单位设置像素高度)会影响密度因子,屏幕大小不同。什么可以是一种方式来计算高度(让说50%)的儿童布局,将任何密度相同的所以。

回答

2

SOLUTION:

在我的onCreate(),添加以下行:

setContentView(R.layout.mainpage); 

    root = (LinearLayout) findViewById(R.id.mainroot);  
    root.post(new Runnable() { 
     public void run() { 
      Rect rect = new Rect(); 
      Window win = getWindow(); 
      win.getDecorView().getWindowVisibleDisplayFrame(rect); 
      int statusHeight = rect.top; 
      int contentViewTop = win.findViewById(Window.ID_ANDROID_CONTENT).getTop(); 
      titleHeight = contentViewTop - statusHeight; 
      Log.i(Utility.TAG, "titleHeight = " + titleHeight + " statusHeight = " + statusHeight + " contentViewTop = " + contentViewTop); 

      // CALCULATE THE SIZE OF INNER LAYOUTS 
      calculateChildSize(); 
     } 
    }); 

与上面的代码,我得到的标题栏的&状态条的值。从metrics.heightPixels;扣除它,我得到屏幕所需的高度。

好点是这个代码适用于所有密度的。

希望这可以帮助其他人。

改进:我必须为我的应用程序中的所有活动执行类似的计算,因此只考虑编写一次代码。我可以将titleHeight保存为静态变量,以便在所有活动中使用。 但是

用户可以在运行时改变手机的密度。 如果是这样,那么Activity的onCreate会再次被调用吗? 如果没有,那么我可以捕捉密度变化事件,我可以添加此代码并使当前活动刷新。

任何想法改进建议,赞赏。

+0

我不认为用户可以在运行时更改设备密度,但在3.2中引入了兼容模式后,我不确定这会对它造成怎样的影响。至于你的测量,如果你真的不需要“状态栏”和“标题栏”的大小,但只真的需要你的意见的可用大小,那么你为什么不在你的运行()方法:'run(){sRootHeight = root.getHeight(); }'sRootHeight'是一个静态类变量,所以你的其他活动可以引用它。 – 2012-02-03 02:00:00

+0

@Turbo,我实际上有两排3个按钮。基于可用空间,我计算按钮的高度和宽度,考虑它们之间的空间。我在XML中添加了两行,每行3个按钮,root.getHeight();给我的标准尺寸的按钮。如果屏幕处于portriat模式,则在横向模式下,高度大于宽度,反之亦然。基于可用的高度,我可以设置按钮的高度。如果在3.2版中兼容性moe可能会受到一定程度的影响,那么在更高版本中,它也可能完全可用。你说什么 ?? – Tvd 2012-02-03 05:53:56

+0

我还没有玩兼容模式,所以我不太熟悉它的影响。但是使用获取视图高度的root.post()方法是非常安全的,因为无论屏幕大小如何,您都可以在运行时计算所需的空间。如果你担心兼容模式[这里是你如何禁用它](http://developer.android.com/guide/practices/screen-compat-mode.html#Disable) – 2012-02-11 09:18:22

0

//其中rootView是应用程序根视图的对象 final int viewWidt = rootView.getMeasuredWidth();

+0

这给了我“0”,因为在onCreate布局不知道它的大小。 – Tvd 2012-01-09 10:57:22

+0

把'rootView.getMeasuredWidth()'放在'void run'里面。你会得到正确的宽度。 – Arvin 2013-10-16 06:23:50

+0

这个和另一个答案就像“稍后再测量!”一样。而不是回答如何在创建中获得它。 – 2016-08-25 07:38:23