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

相关文章
相关标签/搜索