【问题标题】:How to get the visible size on an Activity?如何获得活动的可见尺寸?
【发布时间】:2011-03-04 21:19:25
【问题描述】:

我如何知道我的活动的可见大小?

我正在尝试获取 Activity 的实际大小,
不是getHeight()getWidth() 的高度和宽度,
这给了我全尺寸的屏幕。

【问题讨论】:

  • 你为什么要这样做?在大多数情况下,这不是必需的,您可能需要它的大多数事情都可以通过 android 附带的更好的技术来处理不同的屏幕尺寸。
  • 我真的需要知道活动的宽度和高度有多少像素。它与制图精度有关。
  • 您是使用地图视图还是自定义视图来显示地图?
  • 是的,我正在从头开始为专有制图信息创建地图视图。我发现自己实现它比使用其他人的代码更容易(至少对我来说:-))。

标签: android screen screen-size


【解决方案1】:

认为你会想要查看Activity.getWindow()Window.getDecorView(),并获得它们的宽度/高度。

【讨论】:

  • int height = this.getWindow().getDecorView().getHeight();
  • 我还是 0,奇怪。
  • 您调用它为时过早,它在 onCreate() 期间没有高度。
  • 我认为最好的方法是在 TreeObserver sceneView.getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() { @Override public boolean onPreDraw() { sceneView.getViewTreeObserver().removeOnPreDrawListener 添加一个 preDrawListener (this); //这里有窗口的代码)
【解决方案2】:

我更喜欢省时的答案:

myActivity.getWindow().getDecorView().getHeight();
myActivity.getWindow().getDecorView().getWidth();

【讨论】:

  • 这是错误的。高度将包括Android的状态栏和屏幕底部导航栏的高度。
  • 为什么你认为你的状态栏和导航栏不在窗口上?
【解决方案3】:

我找到了一种方法来了解我的活动的确切高度:如果您的视图填充了标题栏和任务栏后面的所有可用屏幕,只需使用View.getBottom() 即可获得该活动的实际高度.

【讨论】:

  • getBottom() 是什么?什么类有这个方法?
  • Any View : developer.android.com/reference/android/view/… 它是相对于父级的,这就是为什么在这种情况下你需要它是一个填充所有可用屏幕的视图。
  • int height = this.getWindow().getDecorView().getBottom();
  • getWindow().getDecorView().getBottom() 以像素为单位返回屏幕高度。
【解决方案4】:

我使用我的根布局做到了这一点,问题是当它们第一次运行时,您无法在 onCreate/onStart/onResume 方法中获取此信息(宽度和高度)。

在那之后的任何时候,都可以从你的根布局(LinearLayout/FrameLayout/TableLayout/etc)中检索大小,在我的例子中,我使用的是 FrameLayout:

FrameLayout f = (FrameLayout) findViewById(R.id.layout_root);
Log.d(TAG, "width " + f.getMeasuredWidth() );
Log.d(TAG, "height " + f.getMeasuredHeight() );

或:

FrameLayout f = (FrameLayout) findViewById(R.id.layout_root);
Log.d(TAG, "width " + f.getRight() );
Log.d(TAG, "height " + f.getBottom() );

从这里编辑 -------------------------------------------- ------------

我找到了一种在 onCreted 方法上获取此信息的方法,但前提是您有多个活动。就我而言,我有一个称为第二个活动的主要活动。

在调用 second_activity 之前,在 main_activity 上,通过一个新的 Itent,我可以为 second_activity 添加额外的信息。这是您在第一个活动中需要的代码:

Intent i = new Intent(this, SecondActivity.class);
i.putExtra("width", f.getMeasuredWidth());
i.putExtra("height", f.getMeasuredHeight());
startActivity(i);

在您的第二个活动之后,您可以在第二个活动的 onCreate 方法上检索此信息:

int width = getIntent().getExtras().getInt("width");
int height = getIntent().getExtras().getInt("height");

【讨论】:

    【解决方案5】:

    有一种简单的方法可以使用getDefaultSize 函数获得正确的视图大小。如果 View 跨越整个活动,您可以使用下一种方法来获取活动客户区域维度:

    public void onMeasure(int widthMeasureSpec, int heightMeasureSpec){
        int viewWidth = getDefaultSize(getWidth(), widthMeasureSpec); 
        int viewHeight = getDefaultSize(getHeight(), heightMeasureSpec);
        ...
    }
    

    要使视图扩展到整个活动:

    MyView testView = new MyView(this);
    LinearLayout testViewGroup = new LinearLayout(this);
    testView.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT,
                                              LayoutParams.FILL_PARENT);
    testViewGroup.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT,
                                                   LayoutParams.FILL_PARENT);
    testViewGroup.addView(testView);
    setContentView(testViewGroup);
    

    【讨论】:

      【解决方案6】:

      如果您使用 DataBinding(您应该使用),您可以调用 binding.getRoot().getHeight(),其中 binding 是您使用 DataBindingUtil.setContentView() 或其他此类 DataBindingUtil 方法创建的 ViewDataBinding。您需要等到布局具有大小,您可以这样做:

      binding.getRoot().getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
          @Override
          public void onGlobalLayout() {
              binding.getRoot().getViewTreeObserver().removeOnGlobalLayoutListener(this);
      
              int height = binding.getRoot().getHeight();
          }
      });
      

      请注意,您必须删除 OnGlobalLayoutListener,否则每次布局发生任何变化时,它都会运行它。

      【讨论】:

        【解决方案7】:

        获取活动的高度:

        public static int getActivityHeight(Activity activity)
        {
           return activity.findViewById(android.R.id.content).getHeight();
        }
        

        获取活动的宽度

        public static int getActivityWidth(Activity activity)
        {
            return activity.findViewById(android.R.id.content).getWidth();
        }
        

        【讨论】:

          【解决方案8】:

          您将在 onCreate()/onStart()/onResume() 方法中将高度和宽度设为 0。原因是尚未设置大小。 如果您想知道当前大小,最好在其中一种方法中使用观察者,并在获得当前大小时执行您想要的操作。

          constraint_layout 是下面代码中的布局根元素:

          ConstraintLayout constraintLayout = (ConstraintLayout) findViewById(R.id.constraint_layout);
          constraintLayout.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
              @Override
              public void onGlobalLayout()  {
                  constraintLayout.getViewTreeObserver().removeOnGlobalLayoutListener(this);
                  int width = constraintLayout.getWidth();
                  int height = constraintLayout.getHeight();
                  doSmthMethod(width, height);
              }
          });
          

          【讨论】:

          • 如果您想在布局发生后、视图渲染之前立即获取布局的尺寸,这是一个有效的答案
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-02-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-10-23
          • 2018-06-01
          相关资源
          最近更新 更多