我现在写一个组件,大体功能如下:
   留一个addViews(list<View> views)
   和一个setType(int i )接口
第一个写好了,你传入的views会放入默认布局。
但更换时(setType时)Log会告诉你view有了自己的Parent.我在更改布局的时候也用了this.removeallviews()这个方法,但是没有作用。
我把我的setType(int i)方法贴出来,请高手指教:
public void setType(int i) {
getILayout(i);
this.removeAllViewsInLayout();
this.removeAllViews();
getILayout(i);
}
PS:在布局中是不是child与parent是双向的。我只在parent中remove了,但是没有结果。让我有这样的感觉
PS:这个组件是继承的TableLayout
PS:请高手指点,就差这一点就写完了。

解决方案 »

  1.   

    一个View不能同时加到两个ViewGroup内否则会抛出 throw new IllegalStateException("The specified child already has a parent. " +
                        "You must call removeView() on the child's parent first.");这个异常
      

  2.   

    那如何解决呢?如何实现把remove出来然后更改view的parent控件
      

  3.   

    那如何解决,我根据需求必须让它更换parent。
      

  4.   

    这个你可以在创建view时 建立view的列表list<View>
    想更换ViewGroup时先移除这些view,再把view加到另外个ViewGroup内。
      

  5.   


    import java.util.ArrayList;
    import java.util.List;import android.content.Context;
    import android.util.AttributeSet;
    import android.view.View;
    import android.widget.TableLayout;
    import android.widget.TableRow;public class ImagePanel extends TableLayout { private Context context;
    // current imageview size
    private int current_imageview_size;
    private List<View> views; // the state of view // the type of layout
    public static final int TYPEONE = 1;
    public static final int TYPETWO = 2;
    public static final int TYPETHREE = 3;
    public static final int TYPEFOUR = 4;

    //colum and row in this tablelayout
    private TableRow onerow;
    private TableRow tworow;
    private TableRow threerow;
    private TableRow fourrow;
    private List<TableRow> rows; public ImagePanel(Context context, AttributeSet attrs) {
    super(context, attrs);
    // TODO Auto-generated constructor stub
    this.context=context;
    this.setStretchAllColumns(true);
    this.setShrinkAllColumns(true);

    onerow=new TableRow(context);
    tworow=new TableRow(context);
    threerow=new TableRow(context);
    fourrow=new TableRow(context);
    rows=new ArrayList<TableRow>();
    rows.add(onerow);
    rows.add(tworow);
    rows.add(threerow);
    rows.add(fourrow);
    } public ImagePanel(Context context) {
    super(context);
    // TODO Auto-generated constructor stub
    this.context=context;
    this.setStretchAllColumns(true);
    this.setShrinkAllColumns(true);
    } // the interface used to add views
    public void addviews(List<View> views) { this.views = views;
    current_imageview_size = views.size();
    getILayout(TYPEONE);
    } public void setType(int i) {
    getILayout(i);
    this.removeAllViewsInLayout();
    this.removeAllViews();
    for(int row=0;i<rows.size();row++){
    rows.get(row).removeAllViews();
    }
    getILayout(i);
    } // set the layout
    private void getILayout(int type) { switch (current_imageview_size) {
    case 1:// 一张
    switch (type) {
    case TYPEONE:// 第一种布局(1,1)
    addView(views.get(0));
    break;
    }
    break;
    case 2:// 二张
    switch (type) {
    case TYPEONE:// 第一种布局(2,1)
    onerow.removeAllViews();
    onerow.addView(views.get(0));
    this.addView(onerow, getLayoutParams());

    tworow.removeAllViews();
    tworow.addView(views.get(1));
    this.addView(tworow, getLayoutParams()); break;
    case TYPETWO:// 第二种布局(1,2)
    onerow.removeAllViews();
    onerow.addView(views.get(0));
    onerow.addView(views.get(1));
    this.addView(onerow, getLayoutParams()); break;
    }
    break;
    case 3:// 三张
    switch (type) {
    case TYPEONE:// 第一种布局(3,1)
    onerow.addView(views.get(0));
    this.addView(onerow, getLayoutParams()); tworow.addView(views.get(1));
    this.addView(tworow, getLayoutParams()); threerow.addView(views.get(2));
    this.addView(threerow, getLayoutParams());

    break;
    case TYPETWO:// 第二种布局(1,3)
    onerow.addView(views.get(0));
    onerow.addView(views.get(1));
    onerow.addView(views.get(2));
    this.addView(onerow, getLayoutParams());
    break;
    case TYPETHREE:// 第三种布局(2,1) 2(1,2)
    TableRow.LayoutParams params = new TableRow.LayoutParams();
    params.span = 2;
    onerow.addView(views.get(0),params);
    this.addView(onerow, getLayoutParams()); tworow = new TableRow(context);
    tworow.addView(views.get(1));
    tworow.addView(views.get(2));
    this.addView(tworow, getLayoutParams());
    break;
    case TYPEFOUR:// 第四种布局(2,1) 1(1,2)
    onerow.addView(views.get(0));
    onerow.addView(views.get(1));
    this.addView(onerow, getLayoutParams());

    params = new TableRow.LayoutParams();
    params.span = 2;
    tworow.addView(views.get(2),params);
    this.addView(tworow, getLayoutParams());
    break;
    }
    break;
    case 4:// 四张
    switch (type) {
    case TYPEONE:// 第一种布局(2,2)
    onerow.addView(views.get(0));
    onerow.addView(views.get(1));
    this.addView(onerow, getLayoutParams()); tworow.addView(views.get(2));
    tworow.addView(views.get(3));
    this.addView(tworow, getLayoutParams());
    break;
    case TYPETWO:// 第二种布局(1,4)
    onerow.addView(views.get(0));
    onerow.addView(views.get(1));
    onerow.addView(views.get(2));
    onerow.addView(views.get(3));
    this.addView(onerow, getLayoutParams());
    break;
    case TYPETHREE:// 第三种布局(4,1)
    onerow.addView(views.get(0));
    this.addView(onerow, getLayoutParams()); tworow.addView(views.get(1));
    this.addView(tworow, getLayoutParams()); threerow.addView(views.get(2));
    this.addView(threerow, getLayoutParams()); fourrow.addView(views.get(3));
    this.addView(fourrow, getLayoutParams());
    break;
    case TYPEFOUR:// 第四种布局(2,1) 2(1,3)
    TableRow.LayoutParams params = new TableRow.LayoutParams();
    params.span = 3;
    onerow.addView(views.get(0), params);
    this.addView(onerow, getLayoutParams()); tworow.addView(views.get(1));
    tworow.addView(views.get(2));
    tworow.addView(views.get(3));
    this.addView(tworow, getLayoutParams());
    break;
    }
    break;
    }
    }
    }
    我是这样写的,其中还有一部分没有写完。当然和现在出现的错误没有关系。
    我用的是removeallviews这个方法来释放父控件。请高手指点一二。谢谢了。