Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/225.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android:仅获取根布局的屏幕大小_Android_Screen_Android Linearlayout_Dimensions - Fatal编程技术网

Android:仅获取根布局的屏幕大小

Android:仅获取根布局的屏幕大小,android,screen,android-linearlayout,dimensions,Android,Screen,Android Linearlayout,Dimensions,请把我接过来: 我想在onCreate()方法中获得活动/布局可用空间的高度/宽度,以计算可提供给子布局的高度。我可以通过以下方式获得屏幕大小: root = (LinearLayout) findViewById(R.id.mainroot); // Main layout of LinearLayout android.view.Display display = getWindowManager().getDefaultDisplay(); int

请把我接过来:

我想在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
这两种方法/方式给了我相同的高度和宽度,即全屏幕的大小。我要找的是,在扣除应用程序标题、状态栏等后,获得布局可用的实际高度

你知道怎么得到这个吗。或者要知道书名的大小,等等——这里应该算什么。在emulator上,我看到顶部有2个条-1个必须是应用程序标题,另一个是什么。我可以得到它们的高度,并从屏幕高度中扣除


还有一点:在这种情况下,我将以编程方式设置高度,因此它将基于像素(因为我只能以像素为单位设置高度),这将影响不同屏幕尺寸的密度因子。对于任何密度都相同的子布局,有什么方法可以计算高度(比如50%)。

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

解决方案:

在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中扣除我获得屏幕所需的高度

好的一点是,该代码适用于所有密度

希望这对其他人也有帮助

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

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


如果有任何改进建议,我们将不胜感激。

这将为我提供“0”,因为在onCreate中,布局不知道其大小。put
rootView.getMeasuredWidth()
inside
void run
。您将获得正确的宽度。这和另一个答案与说“稍后再测量!”相同,而不是回答如何在oncreate中获得它。我认为用户无法在运行时更改设备密度,尽管随着3.2中引入兼容模式,我不确定这会如何影响它。至于您的度量,如果您实际上不需要“状态栏”和“标题栏”的大小,而只需要视图的可用大小,那么为什么不在run()方法中执行此操作:
run(){sRootHeight=root.getHeight();}
其中
sRootHeight
是一个静态类变量,因此您的其他活动可以引用它。@Turbo,实际上我有两行,每行3个按钮。根据可用空间,我计算按钮的高度和宽度,并考虑按钮之间的空间。我在XML中添加了两行3个按钮,每个按钮都是root.getHeight();给我按钮的标准尺寸。如果屏幕为倾斜模式,则高度大于宽度,反之亦然。根据可用的高度,我设置了按钮的高度。如果在3.2中,兼容性moe可能会受到一定程度的影响,那么在进一步的版本中,它也可能完全可用。你说呢?我还没有玩过兼容模式,所以我不太熟悉它的影响。但是我认为使用root.post()方法获取视图高度是非常安全的,因为无论屏幕大小如何,都可以在运行时计算所需的空间。如果您关心兼容性模式@Tvd,则如果视图中有操作栏,则会显示此独占操作栏高度。