【问题标题】:Global Layout listeners returns 0全局布局侦听器返回 0
【发布时间】:2020-02-05 19:08:12
【问题描述】:

您好,我想通过全局布局监听器获取相对布局的高度和宽度:

final RelativeLayout relativeLayout = binding.rl;

      relativeLayout.getViewTreeObserver()
              .addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
           @Override
           public void onGlobalLayout() {
               // TODO Auto-generated method stub

                   width = relativeLayout.getWidth();
                   height = relativeLayout.getHeight();
                   relativeLayout.getViewTreeObserver()
                           .removeOnGlobalLayoutListener(this);

           }
       });

我的代码的问题是宽度和高度都变为零了。有人可以告诉我任何相同的解决方案。提前致谢。

   <RelativeLayout
                                android:id="@+id/rl"
                                android:layout_width="wrap_content"
                                android:layout_height="wrap_content"
                               android:layout_marginTop="@dimen/dp12">

  <androidx.recyclerview.widget.RecyclerView
  android:layout_width="match_parent"
  android:layout_height="wrap_content"
                                    />
    </RelativeLayout>

【问题讨论】:

    标签: java android android-layout android-fragments


    【解决方案1】:

    如果您没有其他选择,请尝试使用 getMeasuredWidth() 或 getMeasuredHeight() :

    relativeLayout.measure(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
    int width = relativeLayout.getMeasuredWidth();
    int height = relativeLayout.getMeasuredHeight();
    

    但根据您的问题,仅当高度或重量高于 0 时才尝试 removeOnGlobalLayoutListener,因为如果您的布局宽度/高度为“wrap_content”,则它实际上可能为 0:

        relativeLayout.getViewTreeObserver()
                .addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
                    @Override
                    public void onGlobalLayout() {
                        // TODO Auto-generated method stub
    
                        width = relativeLayout.getWidth();
                        height = relativeLayout.getHeight();
    
                        if (width > 0) {
                            relativeLayout.getViewTreeObserver()
                                    .removeOnGlobalLayoutListener(this);
                        }
                    }
                });
    

    【讨论】:

    • 这样做之后我的问题也是一样的:` relativeLayout.getViewTreeObserver() .addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { @Override public void onGlobalLayout() { setWidth(relativeLayout.getWidth()); ; setHeight(relativeLayout.getHeight());; if(getWidth()>0){ relativeLayout.getViewTreeObserver() .removeOnGlobalLayoutListener(this); } } }); `
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-05-23
    • 2020-05-26
    • 1970-01-01
    • 2018-05-25
    • 1970-01-01
    • 2017-07-01
    • 1970-01-01
    相关资源
    最近更新 更多