Android 流式佈局實現方法

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

相關文章
相關標籤/搜索