我有下一个观点hiererchy:
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:paddingLeft="10dp"
android:paddingRight="10dp"
android:gravity="center">
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:background="@drawable/group_bg"
android:gravity="center_vertical"
android:baselineAligned="false">
<LinearLayout
android:id="@+id/itemplace"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginRight="5dp"
android:layout_weight="1" >
<include
android:layout_width="wrap_content"
android:layout_height="wrap_content"
layout="@layout/pin" />
</LinearLayout>
<FrameLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/arrow_black"/>
</LinearLayout>
</LinearLayout>
我需要在此层次结构绘制之前获得itemplace宽度。我不能使用OnLayoutChangeListener,因为我使用API级别7。
我知道我必须使用measure()和layout()方法来计算我的视图大小,但我不知道要做什么。
我的层次结构中的根视图必须填满屏幕的所有宽度,因此itemplace宽度取决于父级大小,父级填充和FrameLayout宽度。
我必须做些什么来获得宽度?
答案 0 :(得分:2)
我找到了获取视图宽度的方法。我可以在android测量之后但在使用ViewTreeObserver中的OnPreDrawListener进行绘制之前得到它:
view.getViewTreeObserver().addOnPreDrawListener(new OnPreDrawListener()
{
@Override
public boolean onPreDraw()
{
int avaliableWidth = view.getWidth() - view.getPaddingLeft() - view.getPaddingRight();
Log.d("width", String.valueOf(avaliableWidth));
return true;
}
});
来自Android文档:
在即将绘制视图树时要调用的回调方法。 此时,树中的所有视图都已经过测量并给出了一个 帧。客户端可以使用它来调整其滚动边界甚至是 在绘图之前请求新的布局。
答案 1 :(得分:0)
自API 1起可用:
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
int parentWidth = MeasureSpec.getSize(widthMeasureSpec);
int parentHeight = MeasureSpec.getSize(heightMeasureSpec);
}