开发者社区> 问答> 正文

动态添加View组件出错?报错

我想实现,通过监听点击按钮事件,每点击一次,就往按钮下面的layout添加一个自定义View。

可是当我点击第二次的时候,就报错了,错误如下:

就是说要removeView后才可以继续添加View,可是如果调用了removeView的方法后,就达不到动态添加View的目的了。

我的代码如下:

public void onCreate(Bundle savedInstanceState) { 
		super.onCreate(savedInstanceState); 
		//setContentView(R.layout.main); 
		final LinearLayout layout2=new LinearLayout(this); 
		layout2.setOrientation(LinearLayout.VERTICAL); 
		Button btn1=new Button(this); 
		setContentView(layout2); 
		btn1.setText("Button1");  
		layout2.addView(btn1);  
		
		addView = getLayoutInflater().inflate(R.layout.child, null);
		tv = (TextView)addView.findViewById(R.id.tv);
		img = (ImageView)addView.findViewById(R.id.img);
		img.setImageResource(R.drawable.logo);
		
		listen1 = new OnClickListener() { 
			public void onClick(View v) { 				
				tv.setText("ADD");
				layout2.addView(addView);
			} 
		}; 
		btn1.setOnClickListener(listen1); 
	}
谁能告诉我这是怎么回事吗?

该怎样才可以实现动态添加自定义View?

谢谢了!

展开
收起
爱吃鱼的程序员 2020-06-22 18:51:55 634 0
1 条回答
写回答
取消 提交回答
  • https://developer.aliyun.com/profile/5yerqm5bn5yqg?spm=a2c6h.12873639.0.0.6eae304abcjaIB

    把你那部分代码移到onClick里面去,也就是这样:

    listen1=newOnClickListener(){
       publicvoidonClick(Viewv){
           addView=getLayoutInflater().inflate(R.layout.child,null);
           tv=(TextView)addView.findViewById(R.id.tv);
           img=(ImageView)addView.findViewById(R.id.img);
           img.setImageResource(R.drawable.logo);
           tv.setText("ADD");
           layout2.addView(addView);
       }
    };

    还真是这样子,搞了好几天了,现在终于解决了,谢谢。

    layout2.addView(addView);这里每次add的对象都是同一个view,所以会报错的。你每次add的对象(addView)应该重新创建并赋值,我也是最近学android发现这个问题的。

    简单说吧,layout2.addView(addView);后,这个addView就已经有父亲了,当你再执行layout2.addView(addView);时,这个addView就会拥有两个父亲,发生冲突的。所以你应该重新创建一个addView对象。谢谢吖!果然是这样色原因。
    2020-06-22 18:52:10
    赞同 展开评论 打赏
问答分类:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
fibjs 模块重构从回调到协程--陈垒 立即下载
低代码开发师(初级)实战教程 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载