0

私は次のビュー階層を持っています:

     <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>

この階層が描画される前に、アイテムプレースの幅を取得する必要があります。API レベル 7 を使用しているため、OnLayoutChangeListener を使用できません。

ビューのサイズを計算するには、 measure() および layout() メソッドを使用する必要があることは知っていますが、それを行うのが難しいことはわかりません。

私の階層のルート ビューは画面の全幅を埋める必要があるため、itemplace の幅は親のサイズ、親のパディング、および FrameLayout の幅に依存していました。

幅を確保するにはどうすればよいですか?

4

2 に答える 2

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のドキュメントから:

ビューツリーが描画されようとしているときに呼び出されるコールバックメソッド。この時点で、ツリー内のすべてのビューが測定され、フレームが与えられています。クライアントはこれを使用して、スクロール境界を調整したり、描画が行われる前に新しいレイアウトを要求したりすることもできます。

于 2012-07-11T06:07:24.613 に答える
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);
}
于 2012-07-11T06:25:12.840 に答える