1

カスタム ビューグループ クラスにレイアウトの問題があります。

コンストラクターで init() を呼び出します。私の init() 関数では、他のいくつかのビューを追加する LinearLayout を含む xml ファイルからビューグループのレイアウトを膨らませます。

スペーサー (View layout_width="0" and layout_weight="1") を使用してアイテムを均等に分散しています。

問題はここにあります。子を追加するときに、レイアウトはまだ幅を定義していません。したがって、スペーサーはすべてサイズが 0 であり、実際には「line_dot」アイテムを均等に配置しません。どういうわけかサイズを更新するにはどうすればよいですか?

public class SliderSwitch extends FrameLayout {

...
    public SliderSwitch(Context context, AttributeSet attrs) {
        super(context, attrs);
        init(context);
    }

    private void init(Context context)
    {
        LayoutInflater inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        inflater.inflate(R.layout.slider_switch,this);


        sliderLayout = (LinearLayout) findViewById(R.id.sliderLayout);
        labelLayout = (LinearLayout) findViewById(R.id.labelLayout);


        // add one spacer
        View spacer = (View) inflate(context,R.layout.spacer, null);
        sliderLayout.addView(spacer);

        // setup the view depending on how many elements there are
        for (int i=1;i<numberOfElements-1;i++) {

            ImageView lineDot = (ImageView) inflater.inflate(R.layout.slider_switch_line_dot, null);
            sliderLayout.addView(lineDot);

            View spacer = (View) inflate(context,R.layout.spacer, null);
            sliderLayout.addView(spacer);
        }

    }
... 
}

これは、スペーサーの xml ファイルです。

<View
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="0dp"
    android:layout_height="0dp"
    android:layout_weight="1" />

これは私のビューグループレイアウトのものです

<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/mainLayout"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" 
    android:orientation="vertical">

    <RelativeLayout
        android:id="@+id/relLayout"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" >

        <LinearLayout
            xmlns:android="http://schemas.android.com/apk/res/android"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="3dp"
            android:orientation="horizontal" >

            <ImageView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:src="@drawable/left_bg" />

            <LinearLayout
                android:id="@+id/sliderLayout"
                android:layout_width="0dp"
                android:layout_height="match_parent"
                android:layout_weight="1"
                android:background="@drawable/middle_bg"
                android:gravity="center"
                android:orientation="horizontal" >

               <!-- <include layout="@layout/spacer"/> -->

            </LinearLayout>

            <ImageView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:src="@drawable/right_bg" />
        </LinearLayout>

        <ImageButton
            android:id="@+id/sliderKnob"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentLeft="true"
            android:layout_alignParentTop="true"
            android:layout_marginLeft="0dp"
            android:background="@null"
            android:src="@drawable/knob" />
    </RelativeLayout>

</LinearLayout>
4

2 に答える 2

2

私は今解決策を見つけました。コードで LayoutParams を再度設定する必要があります (xml ファイルで既に定義されている場合でも)。バグのようです。しかし、この解決策は機能します:

    // add one spacer
    View spacer = (View) inflate(context,R.layout.spacer, null);
    spacer.setLayoutParams(new LinearLayout.LayoutParams(1,LayoutParams.WRAP_CONTENT,1.0F));
    sliderLayout.addView(spacer);

    // setup the view depending on how many elements there are

    for (int i=1;i<numberOfElements-1;i++) {

        ImageView lineDot = (ImageView) inflater.inflate(R.layout.slider_switch_line_dot, null);

        sliderLayout.addView(lineDot);

        spacer = (View) inflate(context,R.layout.spacer, null);
        spacer.setLayoutParams(new LinearLayout.LayoutParams(1,LayoutParams.WRAP_CONTENT,1.0F));
        sliderLayout.addView(spacer);
    }
于 2012-12-09T13:21:07.360 に答える
0

onSizeChangedコールバックで init() を呼び出すことができます。このコールバックは複数回実行される可能性があるため、2 回呼び出さないようにフラグを設定して保持することを忘れないでください。

于 2012-12-06T00:08:38.643 に答える