android ViewGroup删除子视图时应该注意的一个问题

在Activity中创建一个LinearLayout,创建一个scrollHorizon对象(scrollHorizon继承自ViewGroup),在scrollHorizon中调用createLayout函数来加载myView(继承自View)对象,然后调用deleteAllView函数来删除所有的视图。

scrollHorizon代码:

public class scrollHorizon extends ViewGroup {

	private Context context;

	public scrollHorizon(Context context) {
		super(context);
		
		this.context = context;
		
		createLayout();
		
		deleteAllView();
	}
	@Override
	protected void onLayout(boolean changed, int l, int t, int r, int b) {
		
		int childCount = this.getChildCount();
		int childLeft = 0;
		int childTop = 0;
		for(int i = 0; i < childCount; i++){
			View child = getChildAt(i);
			child.setVisibility(View.VISIBLE);
			child.measure(r - l, b - t);
			child.layout(childLeft, childTop, childLeft + child.getMeasuredWidth(),childTop + child.getMeasuredHeight());
			if(childLeft <= 320){
				childLeft = childLeft + child.getMeasuredWidth();
			}
			else{
				childLeft = 0;
				childTop = childTop + child.getMeasuredHeight();
			}
		}
	}

	public void createLayout(){
	
		Resources resource = this.getResources();
		
		PackageManager pmanager = context.getPackageManager();
		
		final Intent mainIntent = new Intent(Intent.ACTION_MAIN, null);
                mainIntent.addCategory(Intent.CATEGORY_LAUNCHER);
        
                List<ResolveInfo> list = pmanager.queryIntentActivities(mainIntent, 0);
		
    
                for( int i = 0; i < list.size(); i++){
        	          int icon = R.drawable.contacts_button_normal;
        	          LinearLayout linear = new LinearLayout(context);
        	          linear.setLayoutParams(new LayoutParams(45, 45));
        	          linear.setBackgroundDrawable(this.getResources().getDrawable(R.drawable.icon));
        	
        	          ImageView image2 = new ImageView(context);
        	          image2.setBackgroundDrawable(this.getResources().getDrawable(R.drawable.icon));
        	          Drawable drawable = resource.getDrawable(icon);
        	
        	          ImageView image = new ImageView(context);
        	
        	          image.setBackgroundDrawable(drawable);
        	          linear.addView(image2);
        	          linear.addView(image);
        	          this.addView(linear);
               }
	}
	
	public void deleteAllView(){
		int size = this.getChildCount();
		for( int i = 0; i < size; i++){
			this.removeViewAt(i);
		}
	}
}

myView代码:

public class myView extends View {

	public myView(Context context) {
		super(context);
		
		setLayoutParams(new LayoutParams(40,40));
	}

}


主Activity代码:

public class scrollHorizonTest extends Activity {
    
   
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        
        LinearLayout linear = new LinearLayout(this);
        
        scrollHorizon horizon = new scrollHorizon(this);
      
        linear.addView(horizon);
         
        this.setContentView(linear);
    }
}


显示结果:



如果不调用deleteAllView函数,那程序没有问题,可以正常的进行显示,但调用deleteAllView函数存在空指针异常。

原因为:当你删除掉第一个View后(假设总共有两个View),当前ViewGroup的子视图只有一个,而这个子视图的位置变为0,所以当你调用removeViewAt(1)时会出现空指针异常,正确的删除方法应该是将deleteAllView函数中的removeViewAt(i)修改为removeViewAt(0);

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值