android自己並不提供流式佈局,有一類需求,如淘寶客戶端中選擇商品的款式時,款式的按鈕根據其文字不一樣而長度變化,而且不一樣的手機屏幕的寬度也不一樣,想要實現流式地排版按鈕,就須要動態地添加和判斷了。android
本文提供了一種簡單的流式佈局實現方法,非封裝的控件,但簡單實用。數組
這裏隱藏的數據格式的細節,不貼出所有代碼app
首選,咱們對於正式的界面有一個佈局,可是咱們爲了測試這個佈局,須要把這個xml從新inflate出來,把控件加進去,纔可以測出控件的長度。ide
如下的代碼把當前界面的layout重複地inflate出來,做爲樣例佈局
sampleView = (View) LayoutInflater.from(StyleSelectActivity.this).inflate( R.layout.activity_common_select_style, null); sampleTv = (TextView) sampleView.findViewById(R.id.sample_text); sampleContainer = (LinearLayout) sampleView.findViewById(R.id.rl_sale_style_content); sampleDivide = (View) sampleView.findViewById(R.id.view_divider1);
當咱們要添加一個TextView時:
(1)使用sample控件先設置標籤
(2)在sampleView中測量sample控件的長度
(3)加上須要的margin長度(注意要轉化成px)
(4)判斷當前行剩餘的長度,可否容納這個標籤,若是能,則新建一個tv加入當前行的linearlayout中,不然,新建一個linearlayout,加入到下一行,把剩餘長度更新爲控件寬度測試
// 機智地測試它的寬度 sampleTv.setText("一個動態長度的標籤"); int w = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED); int h = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED); sampleTv.measure(w, h); int width = sampleTv.getMeasuredWidth(); // 轉成px int margin = (int) (TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 20, this.getResources() .getDisplayMetrics())); if (width + margin < tmpLen) { ll.addView(tv); tmpLen -= width + margin; } else { rl_sale_style_content.addView(ll); ll = getNewLL(); ll.addView(tv); tmpLen = len - width - margin; }
剩下的事情,只須要把表現用數組管理起來,控制他們的狀態,點擊事件就好了。this
文章爲原創,轉載請註明出處。code