天天看點

android動态布局

android動态布局

不知道各位有沒有碰到過這樣的問題:在一個布局中添加多個子布局,每個子布

局有兩種樣式,比如正面一個樣式,點選後,替換到背面又是另一種樣式。且需

要使得這些子布局始終隻有一個是保持背面的狀态,點選其他子布局時它才會回到正面樣式。

最開始,我選擇了用xml布局檔案先拟好一個空的布局架構,然後再在代碼中動态的添加不同資訊,但是這樣的話,涉及一個問題,我不停的在将内容(文字、

圖檔)添加進去,那麼我的記憶體消耗會非常大,而前面所占用的記憶體又不能銷毀,這樣,程式很容易報記憶體溢出的錯。

一 般占記憶體的都是圖檔,是以我先想到的,是将圖檔再壓縮小一倍,這樣試下來的結果不錯,運作的時候沒有再報錯了,但是當我回退到前一個activity後, 再點選這個子產品,點選幾次後,又開始報記憶體溢出的錯誤,于是我不得不重新尋找其他的方法來解決Android上最令人頭疼的記憶體溢出報錯。

後來, 決定将每個子布局封裝成一個ViewGroup,要用到這個布局的時候,才将它顯示,不用的時候便它從parent布局中remove掉,這樣不需要重複的去建立添加,不會浪費記憶體,而且可以省去重複代碼的工作,下面言歸正傳。

1、 先将子布局封裝:

private ViewGroup builtView(int index,int width,intheight,int x,int y,Boolean clicks)

index為子布局的id,width、height為該子布局的寬、高,x、y為該子布局在螢幕中的坐标,clicks則是判斷該子布局的正面是否被點選。

2、 用代碼編寫布局檔案:

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{

//反面布局

}

3、 //指定在哪個布局檔案中進行動态更新[java] LayoutInflater inflater = getLayoutInflater();

View mainView = inflater.inflate(R.layout.main,null);

setContentView(mainView);

//将封裝的ViewGroup放到ArrayList中,一個List存放正面,一個List存放背面:

ArrayList lsit1 = newArrayList();

ArrayList lsit2 = newArrayList();

//将參數設進布局:

ViewGroup vg1 = builtView(0,width,height,x,y,true);

//将ViewGroup放入list1中:

list1.add(vg1);

//背面同上

… …

4、 對子布局進行操作:先将确定對list1中哪個ViewGroup進行操作,對該

ViewGroup進行點選監聽,在監聽的時候,先判斷是正面還是反面,如果是正面,就顯示正面的樣式,如果是反面就顯示反面的樣式。

5、 在點選替換樣式的時候,先将布局清空,在将ViewGroup添加進去進行顯示。

實作後的效果很好,沒有再報記憶體溢出的錯