在运行时获取 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();
}
});
我有一个主要 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();
}
});