Android如何在linearlayout中逐行添加Textview

时间:2014-04-17 10:39:12

标签: android android-layout textview android-linearlayout

我试图以编程方式在线性布局中添加文本视图,但问题是,当我添加超过5或7个文本视图时,其他文本视图不会出现,所以我想在下一行添加这些textview,如何将这些textview添加到nextline.please帮助我。提前谢谢。

当我添加一些超过特定数量的textview时,应该在下一行添加。 我的代码如下:

     ArrayList<HashMap<String, String>> sel = new ArrayList<HashMap<String, String>>();
 LinearLayout langaugelayout = (LinearLayout) findViewById(R.id.languagelayout);



    for (int i = 0; i < sel.size(); i++) {
        LinearLayout.LayoutParams llp = new LinearLayout.LayoutParams(
                LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
        llp.setMargins(7, 0, 0, 0);
        TextView lparams = (TextView) inflater.inflate(R.layout.textview,
                null);
        TextView tv = (TextView) lparams.findViewById(R.id.texted);
        tv.setText(sel.get(i).get("lname"));
        tv.setTypeface(Base.typeFaces.get(sel.get(i).get("id")));
        tv.setLayoutParams(llp);
        langaugelayout.addView(tv);
    }

我在linearlayout中添加它。 xml 位于

之下
 <LinearLayout
        android:id="@+id/secondlayout"
        android:layout_width="match_parent"
        android:layout_height="0dip"
        android:layout_below="@+id/firstlayout"
        android:layout_marginBottom="10dp"
        android:layout_weight="0.05"
        android:gravity="center"
        android:orientation="horizontal" >

        <LinearLayout                 /////// adding in this layout..
            android:id="@+id/languagelayout"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:orientation="horizontal" >


        </LinearLayout>

        <TextView
            android:id="@+id/addmore"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Add More"
            android:layout_marginLeft="10dp"
            android:textColor="@android:color/black"
            android:textSize="25sp" />
    </LinearLayout>

2 个答案:

答案 0 :(得分:1)

它们看起来很好,很遗憾地添加了一些它们不适合你的屏幕: - )

这是您正在寻找的Line-breaking widget layout for Android

答案 1 :(得分:1)

使自定义Flow Layout如下所示

public class FlowLayout extends ViewGroup {

private int line_height;

public static class LayoutParams extends ViewGroup.LayoutParams {

    public final int horizontal_spacing;
    public final int vertical_spacing;

    /**
     * @param horizontal_spacing
     *            Pixels between items, horizontally
     * @param vertical_spacing
     *            Pixels between items, vertically
     */
    public LayoutParams(int horizontal_spacing, int vertical_spacing) {
        super(0, 0);
        this.horizontal_spacing = horizontal_spacing;
        this.vertical_spacing = vertical_spacing;
    }
}

public FlowLayout(Context context) {
    super(context);
}

public FlowLayout(Context context, AttributeSet attrs) {
    super(context, attrs);
}

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    assert (MeasureSpec.getMode(widthMeasureSpec) != MeasureSpec.UNSPECIFIED);

    final int width = MeasureSpec.getSize(widthMeasureSpec)
            - getPaddingLeft() - getPaddingRight();
    int height = MeasureSpec.getSize(heightMeasureSpec) - getPaddingTop()
            - getPaddingBottom();
    final int count = getChildCount();
    int line_height = 0;

    int xpos = getPaddingLeft();
    int ypos = getPaddingTop();

    int childHeightMeasureSpec;
    if (MeasureSpec.getMode(heightMeasureSpec) == MeasureSpec.AT_MOST) {
        childHeightMeasureSpec = MeasureSpec.makeMeasureSpec(height,
                MeasureSpec.AT_MOST);
    } else {
        childHeightMeasureSpec = MeasureSpec.makeMeasureSpec(0,
                MeasureSpec.UNSPECIFIED);
    }

    for (int i = 0; i < count; i++) {
        final View child = getChildAt(i);
        if (child.getVisibility() != GONE) {
            final LayoutParams lp = (LayoutParams) child.getLayoutParams();
            child.measure(
                    MeasureSpec.makeMeasureSpec(width, MeasureSpec.AT_MOST),
                    childHeightMeasureSpec);
            final int childw = child.getMeasuredWidth();
            line_height = Math.max(line_height, child.getMeasuredHeight()
                    + lp.vertical_spacing);

            if (xpos + childw > width) {
                xpos = getPaddingLeft();
                ypos += line_height;
            }

            xpos += childw + lp.horizontal_spacing;
        }
    }
    this.line_height = line_height;

    if (MeasureSpec.getMode(heightMeasureSpec) == MeasureSpec.UNSPECIFIED) {
        height = ypos + line_height;

    } else if (MeasureSpec.getMode(heightMeasureSpec) == MeasureSpec.AT_MOST) {
        if (ypos + line_height < height) {
            height = ypos + line_height;
        }
    }
    setMeasuredDimension(width, height);
}

@Override
protected ViewGroup.LayoutParams generateDefaultLayoutParams() {
    return new LayoutParams(1, 1); // default of 1px spacing
}

@Override
protected boolean checkLayoutParams(ViewGroup.LayoutParams p) {
    if (p instanceof LayoutParams) {
        return true;
    }
    return false;
}

@Override
protected void onLayout(boolean changed, int l, int t, int r, int b) {
    final int count = getChildCount();
    final int width = r - l;
    int xpos = getPaddingLeft();
    int ypos = getPaddingTop();

    for (int i = 0; i < count; i++) {
        final View child = getChildAt(i);
        if (child.getVisibility() != GONE) {
            final int childw = child.getMeasuredWidth();
            final int childh = child.getMeasuredHeight();
            final LayoutParams lp = (LayoutParams) child.getLayoutParams();
            if (xpos + childw > width) {
                xpos = getPaddingLeft();
                ypos += line_height;
            }
            child.layout(xpos, ypos, xpos + childw, ypos + childh);
            xpos += childw + lp.horizontal_spacing;
        }
    }
}
}

并在xml中使用它,如下所示

<your_pacakge_name.FlowLayout
    android:id="@+id/linearlayout"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:background="#aabbcc"
    android:orientation="horizontal" >
</your_pacakge_name.FlowLayout>