如何获取活动的窗口宽度和高度?

时间:2012-09-14 16:53:39

标签: android android-layout

我有一个ListFragment,它在onActivityCreated()方法中添加了2个视图 - 一个MapView通用视图(持久标题)。我希望ListView在纵向模式下和MapView右侧以及横向模式下的标题下方显示在MapView和标题下方。我还希望MapView的高度(纵向)和宽度(横向)为可用窗口大小的百分比(减去操作栏,状态栏和导航栏 - 如果设备上存在)。为了实现这一点,我相信我需要获得窗口大小并计算所有3个视图的适当高度,宽度和布局边距。我在类似的问题中尝试了一些建议,但解决方案总是返回设备的高度/宽度,而不是活动的窗口大小。

任何想法。提前致谢。

5 个答案:

答案 0 :(得分:8)

DisplayMetrics metrics = context.getResources().getDisplayMetrics();
int width = metrics.widthPixels;
int height = metrics.heightPixels;

答案 1 :(得分:8)

通过执行以下操作可以实现扩展:

DisplayMetrics metrics = context.getResources().getDisplayMetrics();
LayoutParams params = new LayoutParams(metrics.widthPixels * desiredWidthPercentage, metrics.heightPixels * desiredHeightPercentage);

然后将参数应用于您想要的视图。

对于不同的方向,我建议在布局和布局 - 土地文件夹中使用不同的布局,或者动态添加规则如下:

params.addRule(RelativeLayout.Above, ViewId);

查看规则的所有关键字,请参阅:http://developer.android.com/reference/android/widget/RelativeLayout.html

答案 2 :(得分:2)

我能够通过使用ViewTreeObserver来解决这个问题。

ViewTreeObserver vtObserver = view.getViewTreeObserver();
vtObserver.addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
    @Override
    public void onGlobalLayout() {
        // check if the view's height and/or width > 0
        // don't forget to remove the listener when done using removeOnGlobalLayoutListener
    }
});

答案 3 :(得分:0)

我不确定这里的答案是获取屏幕尺寸,而是使用适当的纵向和横向布局,使用权重属性在不同视图之间分配屏幕空间。

我相信你可以拥有一个可以托管其他片段布局的容器布局。

您可以在布局xml文件中看到一些使用片段的简单示例。

http://android-er.blogspot.com/2011/12/simple-exercise-of-fragment-inflate.html

在这里

http://portabledroid.wordpress.com/2011/04/19/programmatic-and-layout-fragments/

此外,请参阅此链接,了解有关为不同屏幕尺寸提供布局的提示:http://developer.android.com/guide/topics/resources/providing-resources.html

我希望这能指出你正确的方向。

答案 4 :(得分:-1)

与其他人建议的一样,我会在每个方向使用不同的布局,并且只是采用不同的方式处理它:

if(getResources().getBoolean(R.bool.is_land)){
   //Set up mapview on the side
} else{
   //Add header to listfragment
}

在res / values-land

中使用布尔值