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