3

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

有任何想法吗。提前致谢。

4

5 回答 5

11
DisplayMetrics metrics = context.getResources().getDisplayMetrics();
int width = metrics.widthPixels;
int height = metrics.heightPixels;
于 2012-09-14T17:21:39.093 回答
9

对于缩放,您可以通过执行以下操作来实现:

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

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

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

params.addRule(RelativeLayout.Above, ViewId);

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

于 2012-09-14T18:05:00.143 回答
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
    }
});
于 2012-11-25T19:47:37.460 回答
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

我希望这能为您指明正确的方向。

于 2012-09-14T17:17:44.270 回答
-1

就像其他人建议的那样,我会为每个方向使用不同的布局,并以不同的方式处理它:

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

在 res/values-land 中使用布尔值

于 2012-09-14T18:30:58.420 回答