1

MyLinearLayoutサブクラス extends がViewGroupあり、その中Viewに s が自動ラップされます。

public class MyLinearLayout extends ViewGroup {
    private final int cellHeight = 70;


    public MyLinearLayout (Context context, AttributeSet attrs) {
        super (context, attrs);
    }


    @Override
    protected void onLayout (boolean changed, int l, int t, int r, int b) {
        int left = 40;
        int top = 20;
        int count = getChildCount ();
        int remainingWidth = 0;

        for (int j = 0; j < count; j++) {
            View childView = getChildAt (j);

            int w = childView.getMeasuredWidth ();
            int h = childView.getMeasuredHeight ();

            if (left != 40 && remainingWidth < w)
            {
                left = 40;
                top += (cellHeight + 20);
            }
            childView.layout (left, top, left + w, top + h);
            remainingWidth = r - l - left - w - 80;
            left += (w + 40);
        }
    }


    @Override
    protected void onMeasure (int widthMeasureSpec, int heightMeasureSpec) {
        int cellWidthSpec = MeasureSpec.makeMeasureSpec (0,
                MeasureSpec.UNSPECIFIED);
        int cellHeightSpec = MeasureSpec.makeMeasureSpec (cellHeight,
                MeasureSpec.EXACTLY);
        int count = getChildCount ();

        for (int i = 0; i < count; i++) {
            View childView = getChildAt (i);
            childView.measure (cellWidthSpec, cellHeightSpec);
        }

        setMeasuredDimension (resolveSize (0, widthMeasureSpec),
                resolveSize (cellHeight * count, heightMeasureSpec));
    }


    public void removeChildViews (ViewGroup rootView) { // not work
        View child;
        if (rootView == null) {
            rootView = this;
        } 
        int count = rootView.getChildCount ();
        Log.i ("--->", count + " start");
        for(int i = 0; i < count; i++) { 
            child = rootView.getChildAt(i);
            Log.i ("--->", rootView.getClass ().toString () + " ROOT");
            Log.i ("--->", child.getClass ().toString () + " CHILD");
            if(child instanceof ViewGroup) {
                removeChildViews ((ViewGroup) child);
            } else if (child != null) {
                rootView.removeView (child);
            }
        }
        Log.i ("--->", rootView.getChildCount () + " end");
    }

}

レイアウトファイルで宣言します:

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

    ...

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"
        android:orientation="horizontal" >
        ...

        <com.test.MyLinearLayout
            android:id="@+id/llayout_autobreak"
            android:layout_width="match_parent"
            android:layout_height="match_parent" >
        </com.test.MyLinearLayout>
    </LinearLayout>
    ...
</LinearLayout>

そしてそれを私の中で使用してActivityください:

    @Override
    protected void onCreate (Bundle savedInstanceState) {
        super.onCreate (savedInstanceState);
        setContentView (R.layout.layout_input);

        ...

        ll_ab = (MyLinearLayout) findViewById (R.id.llayout_autobreak);

        spinner.setOnItemSelectedListener (new OnItemSelectedListener () {

                    @Override
                    public void onItemSelected (AdapterView <?> parent,
                            View view, int position, long id) {

                        ll_ab.removeChildViews(null); // not work
                        ...
                        ...
                    }

                    @Override
                    public void onNothingSelected (AdapterView <?> parent) {

                    }
                });

                ...
    }

私のll_abレイアウトには、、、などのActivityさまざまな が含まれている可能性があります。それらを動的にレイアウトに追加でき、うまく機能します。ただし、それらを一連の新しいsに置き換えようとすると、 は削除されるだけで、他の s は削除されないようです。も使用しようとしますが、機能しません。では、内部のすべてのビューを削除する方法は? 助けてくれてありがとう。ViewTextViewEditViewSpinnerll_abViewremoveChildViews (ViewGroup)MyLinearLayoutTextViewremoveAllViews()ll_ab

4

1 に答える 1

-1

null を removeChildViews に渡していますが、null には子がないため、何も起こりません。removeChildViews に正しい親を渡す必要があります。

于 2015-02-10T07:38:41.377 に答える