【问题标题】:How to get an Activity's window width and height?如何获取 Activity 的窗口宽度和高度?
【发布时间】:2012-09-14 16:53:39
【问题描述】:

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

任何想法。提前致谢。

【问题讨论】:

  • 首先感谢大家的回复。我故意不使用允许权重属性的 ViewGroups 的不同布局。我动态添加视图的原因是 ListActivity 管理我的空状态和“加载”状态。使用我目前的方法,我所要做的就是告诉 ListActivity 我的空视图是什么,并在我有数据时设置列表适配器。这样,当列表为空时,用户将看到我的空视图,并在加载时看到 ProgressBar。我的主要问题是如何以编程方式获取宽度/高度。
  • 我最终在视图中添加了一个 GlobalLayoutListener 以获得宽度和高度。

标签: android android-layout


【解决方案1】:
DisplayMetrics metrics = context.getResources().getDisplayMetrics();
int width = metrics.widthPixels;
int height = metrics.heightPixels;

【讨论】:

    【解决方案2】:

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

    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

    【讨论】:

    • 没有。这是一样的。 DisplayMetrics 包含显示大小,而不是实际活动大小。
    【解决方案3】:

    我能够通过使用 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
        }
    });
    

    【讨论】:

      【解决方案4】:

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

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

      您可以看到一些在布局 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

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

      【讨论】:

        【解决方案5】:

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

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

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

        【讨论】:

          猜你喜欢
          • 2014-05-20
          • 2010-10-11
          • 2013-11-29
          • 1970-01-01
          • 1970-01-01
          • 2014-08-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多