在Android代码中实现动态布局

不知道各位有没有碰到过这样的问题:在一个布局中添加多个子布局,每个子布局有两种样式,比如正面一个样式,点击后,替换到背面又是另一种样式。且需要使得这些子布局始终只有一个是保持背面的状态,点击其他子布局时它才会回到正面样式。

最开始,我选择了用xml布局文件先拟好一个空的布局框架,然后再在代码中动态的添加不同信息,但是这样的话,涉及一个问题,我不停的在将内容(文字、图片)添加进去,那么我的内存消耗会非常大,而前面所占用的内存又不能销毁,这样,程序很容易报内存溢出的错。

一般占内存的都是图片,所以我先想到的,是将图片再压缩小一倍,这样试下来的结果不错,运行的时候没有再报错了,但是当我回退到前一个activity后,再点击这个模块,点击几次后,又开始报内存溢出的错误,于是我不得不重新寻找其他的方法来解决Android上最令人头疼的内存溢出报错。

后来, 决定将每个子布局封装成一个ViewGroup,要用到这个布局的时候,才将它显示,不用的时候便它从parent布局中remove掉,这样不需要重复的去创建添加,不会浪费内存,而且可以省去重复代码的工作,下面言归正传。


1、  先将子布局封装:

[java] view plaincopy


  • <span style="font-size:13px;">private ViewGroup builtView(int index,int width,intheight,int x,int y,Boolean clicks)  
  • </span>  

index为子布局的id,width、height为该子布局的宽、高,x、y为该子布局在屏幕中的坐标,clicks则是判断该子布局的正面是否被点击。


2、  用代码编写布局文件:

[java] view plaincopy


  • <span style="font-size:13px;">RelativeLayout parent = newRelativeLayout(getApplicationContext());  
  •   
  • Parent.setId(index);//设定id  
  •   
  • //设定布局的宽、高,并将它添加到父布局中  
  •   
  • RelativeLayout.LayoutParams rl = newRelativeLayout.LayoutParams(width,height);  
  •   
  • parent.setLayoutPramas(rl);  
  •   
  • //设定子布局的坐标  
  •   
  • rl.leftMargin = x;  
  •   
  • rl.leftMaigin = y;  
  •   
  • //判断点击的是正面还是反面  
  •   
  • if(clicktime == true){  
  •   
  •   //先将之前的内容remove掉  
  •   
  • parent.removeAllViews();  
  •   
  •   //例如:添加一段文字在布局中  
  •   
  •   TextView tv = newTextView(getApplicationContext());  
  •   
  •   tv.setId(index +1);  
  •   
  •   tv.setText(“TextView1”);  
  •   
  •   tv.setTextSize(20);  
  •   
  • tv.setTextColor(Color.WHITE);  
  •   
  •   //TextView布局  
  •   
  • RelativeLayout.LayoutParams tv_params = new RelativeLayout.LayoutParams(  
  •   
  • RelativeLayout.LayoutParams.FILL_PARENT,  
  •   
  • RelativeLayout.LayoutParams.WRAP_CONTENT);  
  •   
  •          tv_params.addRule(RelativeLayout.ALIGN_PARENT_BOTOOM);  
  •   
  •          tv.setLayoutParams(tv_params);  
  •   
  •          //将TextVIew添加到布局中  
  •   
  •          Parent.addView(tv);  
  •   
  • }else{  
  •   
  •    //反面布局  
  •   
  •    … …  
  •   
  • }</span>  


3、  //指定在哪个布局文件中进行动态更新
[java] view plaincopy


  • <span style="font-size:13px;">LayoutInflater inflater = getLayoutInflater();  
  •   
  • View mainView = inflater.inflate(R.layout.main,null);  
  •   
  • setContentView(mainView);  
  •   
  • //将封装的ViewGroup放到ArrayList中,一个List存放正面,一个List存放背面:  
  •   
  • ArrayList<ViewGroup> lsit1 = newArrayList<ViewGroup>();  
  •   
  • ArrayList<ViewGroup> lsit2 = newArrayList<ViewGroup>();  
  •   
  • //将参数设进布局:  
  •   
  • ViewGroup vg1 = builtView(0,width,height,x,y,true);  
  •   
  • //将ViewGroup放入list1中:  
  •   
  • list1.add(vg1);  
  •   
  • //背面同上  
  •   
  • … …</span>  

4、  对子布局进行操作:先将确定对list1中哪个ViewGroup进行操作,对该ViewGroup进行点击监听,在监听的时候,先判断是正面还是反面,如果是正面,就显示正面的样式,如果是反面就显示反面的样式。


5、  在点击替换样式的时候,先将布局清空,在将ViewGroup添加进去进行显示。

实现后的效果很好,没有再报内存溢出的错。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值