在运行时获取 ViewGroup(LinearLayout 的 RecyclerView child)的高度大小(以像素为单位)

get height size ( in pixel ) of a ViewGroup ( RecyclerView child of LinearLayout ) in runtime

我有一个主要 LinearLayout 和两个 RecyclerView 作为 child 并且需要获得第二个 RecyclerView

的高度大小 我尝试了 rv_show_adv.getHeight()rv_show_adv.getLayoutParams().height 但得到了 0 但是当我在真实设备上测试应用程序时我可以看到我在两者上都有高度和宽度但是为什么在 java 代码我总是得到 0 像素 !


/layout/activity_main.xml :

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/mainlinear"
        android:orientation="vertical"
        tools:context=".main.MainActivity"
        android:background="#f3cdcd"
        android:weightSum="1"
        >

        <LinearLayout
            android:orientation="horizontal"
            android:layout_width="match_parent"
            android:layout_height="55dp"
            >

            <android.support.v7.widget.RecyclerView
                android:id="@+id/rv_selected_adv"
                android:layout_width="match_parent"
                android:layout_height="match_parent">

            </android.support.v7.widget.RecyclerView>

        </LinearLayout>

        <android.support.v7.widget.RecyclerView
            android:id="@+id/rv_show_adv"
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:background="#b9f1ce"
            android:layout_weight="1">

        </android.support.v7.widget.RecyclerView>

    </LinearLayout>


真的很困惑,因为当我有一个视图(如 TextView)时,我可以通过 View.getHeight() 获得高度但是为什么当我有一个 ViewGroup

我也尝试通过 LinearLayout.getChildAt(1).getHeight() 获得主要 LinearLayout 的第二个 child 的高度,但再次让我 0

还尝试在 onCreate() 中定义 RecyclerView 变量,并希望在 onResume() 生命周期中获得高度但没有区别!

我想我在我的代码中遗漏了一些东西,你有什么建议?

因为 onCreate 上的 View.getHeight() 是 0,当 onCreateView
时视图需要 onMeasure() 所以 onMeasure() 可能在 onCreated 之后完成,你应该这样做:

int mWidth , mHeight ;
rv_show_adv.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
    @Override
    public void onGlobalLayout() {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
            rv_show_adv.getViewTreeObserver().removeOnGlobalLayoutListener(this);
        } else {
            rv_show_adv.getViewTreeObserver().removeGlobalOnLayoutListener(this);
        }
        mWidth = rv_show_adv.getWidth();
        mHeight = rv_show_adv.getHeight();
    }
});