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

时间:2016-12-30 06:57:44

标签: android android-layout android-recyclerview viewgroup

我有一个主LinearLayout和两个RecyclerView作为孩子,需要获得第二个RecyclerView的身高尺寸

 我试过rv_show_adv.getHeight()rv_show_adv.getLayoutParams().height,但是让我0但是当我在真实设备中测试应用时,我可以看到我有两个高度和宽度,但为什么在java代码中我总是得到0像素!

enter image description here


/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获得主LinearLayout.getChildAt(1).getHeight()的第二个孩子的身高,但再次得到0

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

我想我会错过我的代码中的某些东西你有什么建议吗?

1 个答案:

答案 0 :(得分:1)

由于View.getHeight()上的onCreate为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();
    }
});