【问题标题】:Android: Get Screen size for the root Layout onlyAndroid:仅获取根布局的屏幕大小
【发布时间】:2012-01-09 06:21:49
【问题描述】:

请正确地让我过来:

我想在 onCreate() 方法中获取 Activity/Layout 可用空间的高度/宽度,以计算可以给子布局的高度。我可以使用以下方法获取屏幕尺寸:

      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%)。

【问题讨论】:

    标签: android screen android-linearlayout dimensions


    【解决方案1】:

    解决方案:

    在我的 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();
            }
        });
    

    通过上面的代码,我得到了titleBar & statusBar 的值。从metrics.heightPixels; 中扣除后,我得到了所需的屏幕高度。

    好点是此代码适用于所有密度。

    希望这对其他人也有帮助。

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

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

    任何改进的想法建议都表示赞赏。

    【讨论】:

    • 我不认为用户可以在运行时更改设备密度,尽管在 3.2 中引入了兼容模式,但我不确定这会如何影响它。至于您的测量值,如果您真的不需要“状态栏”和“标题栏”的大小,而只需要视图的可用大小,那么为什么不在 run() 中执行此操作方法:run() { sRootHeight = root.getHeight(); } 其中sRootHeight 是一个静态类变量,因此您的其他活动可以引用它。
    • @Turbo,我实际上必须有 2 行,每行 3 个按钮。根据可用空间,我会考虑按钮之间的空间来计算按钮的高度和宽度。我在 XML 中添加了 2 行,每行 3 个按钮,root.getHeight();给我按钮的标准尺寸。如果屏幕是纵向模式,则在横向模式下高度大于宽度,反之亦然。根据可用的高度,我必须设置按钮的高度。如果在 3.2 中兼容性 moe 可能会受到一定程度的影响,那么在以后的版本中,它也可能完全可用。你说什么??
    • 我没有玩过兼容模式,所以我不太熟悉它的影响。但是我认为使用获取视图高度的 root.post() 方法非常安全,因为无论屏幕大小如何,您都可以在运行时计算所需的空间。如果您担心兼容模式here is how you can disable it
    • @Tvd 将在视图中有操作栏时排除此操作栏高度。
    【解决方案2】:

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

    【讨论】:

    • 这给了我“0”,因为在 onCreate 布局不知道它的大小。
    • rootView.getMeasuredWidth() 放入void run。你会得到正确的宽度。
    • 那个和另一个答案与说“稍后再测量!”是一样的。而不是回答如何在oncreate中获取它。
    猜你喜欢
    • 1970-01-01
    • 2017-06-29
    • 1970-01-01
    • 1970-01-01
    • 2020-05-20
    • 2015-01-18
    • 2019-02-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多