2014-09-14 7 views
6

내 애플 리케이션에서 코드에서 수평 선형 레이아웃에 여러보기를 추가했습니다. 내 문제는 조회수가 증가하여 단일 행에 표시되지 않고 화면이 더 멀리 나아가는 경우입니다. 동적으로보기를 추가 할 수있는 레이아웃이 있으며 첫 번째 행에 다음보기가 맞지 않으면 두 번째 행에 배치됩니다. 처음에는 모든 것을 동적으로 원하기는하지만 뷰의 수를 알지 못합니다. 이 같은 일 : enter image description here여러 행을 가진 android LinearLayout

+0

내가 알고있는 그 무엇인가 존재하지 않는다고 생각하지 않습니다. 아이의 폭을 추가 할 수 없습니까. 부모의 폭보다 큰 경우는, 새로운 수평 LinearLayout를 작성해, 그 대신에 추가해주세요. –

+0

@billynomates이 목적을 위해 작성된 라이브러리 또는이를 수행하는 더 간단한 방법이 있는지 알고 싶습니다. 부모에게 추가하기 전에보기의 너비가 점점 까다로워집니다. –

+1

@MohamadGhafourian : plz 여기가 도움이되기를 바랍니다. https://stackoverflow.com/questions/549451/line-breaking-widget-layout-for-android/560958#560958 –

답변

2

사용이 레이아웃

package com.shashi.app.utils; 

    import android.content.Context; 
    import android.content.res.TypedArray; 
    import android.graphics.Canvas; 
    import android.graphics.Paint; 
    import android.util.AttributeSet; 
    import android.view.View; 
    import android.view.ViewGroup; 

    import com.shashi.app.R; 

    public class FlowLayout extends ViewGroup { 
     private int mHorizontalSpacing; 
     private int mVerticalSpacing; 
     private Paint mPaint; 

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

      TypedArray a = context.obtainStyledAttributes(attrs, 
        R.styleable.FlowLayout); 
      try { 
       mHorizontalSpacing = a.getDimensionPixelSize(
         R.styleable.FlowLayout_horizontalSpacing, 0); 
       mVerticalSpacing = a.getDimensionPixelSize(
         R.styleable.FlowLayout_verticalSpacing, 0); 
      } finally { 
       a.recycle(); 
      } 

      mPaint = new Paint(); 
      mPaint.setAntiAlias(true); 
      mPaint.setColor(0xffff0000); 
      mPaint.setStrokeWidth(2.0f); 
     } 

     @Override 
     protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 
      int widthSize = MeasureSpec.getSize(widthMeasureSpec) 
        - getPaddingRight(); 
      int widthMode = MeasureSpec.getMode(widthMeasureSpec); 

      boolean growHeight = widthMode != MeasureSpec.UNSPECIFIED; 

      int width = 0; 
      int height = getPaddingTop(); 

      int currentWidth = getPaddingLeft(); 
      int currentHeight = 0; 

      boolean breakLine = false; 
      boolean newLine = false; 
      int spacing = 0; 

      final int count = getChildCount(); 
      for (int i = 0; i < count; i++) { 
       View child = getChildAt(i); 
       measureChild(child, widthMeasureSpec, heightMeasureSpec); 

       LayoutParams lp = (LayoutParams) child.getLayoutParams(); 
       spacing = mHorizontalSpacing; 
       if (lp.horizontalSpacing >= 0) { 
        spacing = lp.horizontalSpacing; 
       } 

       if (growHeight 
         && (breakLine || currentWidth + child.getMeasuredWidth() > widthSize)) { 
        height += currentHeight + mVerticalSpacing; 
        currentHeight = 0; 
        width = Math.max(width, currentWidth - spacing); 
        currentWidth = getPaddingLeft(); 
        newLine = true; 
       } else { 
        newLine = false; 
       } 

       lp.x = currentWidth; 
       lp.y = height; 

       currentWidth += child.getMeasuredWidth() + spacing; 
       currentHeight = Math.max(currentHeight, child.getMeasuredHeight()); 

       breakLine = lp.breakLine; 
      } 

      if (!newLine) { 
       height += currentHeight; 
       width = Math.max(width, currentWidth - spacing); 
      } 

      width += getPaddingRight(); 
      height += getPaddingBottom(); 

      setMeasuredDimension(resolveSize(width, widthMeasureSpec), 
        resolveSize(height, heightMeasureSpec)); 
     } 

     @Override 
     protected void onLayout(boolean changed, int l, int t, int r, int b) { 
      final int count = getChildCount(); 
      for (int i = 0; i < count; i++) { 
       View child = getChildAt(i); 
       LayoutParams lp = (LayoutParams) child.getLayoutParams(); 
       child.layout(lp.x, lp.y, lp.x + child.getMeasuredWidth(), lp.y 
         + child.getMeasuredHeight()); 
      } 
     } 

     @Override 
     protected boolean drawChild(Canvas canvas, View child, long drawingTime) { 
      boolean more = super.drawChild(canvas, child, drawingTime); 
      LayoutParams lp = (LayoutParams) child.getLayoutParams(); 
      if (lp.horizontalSpacing > 0) { 
       float x = child.getRight(); 
       float y = child.getTop() + child.getHeight()/2.0f; 
       canvas.drawLine(x, y - 4.0f, x, y + 4.0f, mPaint); 
       canvas.drawLine(x, y, x + lp.horizontalSpacing, y, mPaint); 
       canvas.drawLine(x + lp.horizontalSpacing, y - 4.0f, x 
         + lp.horizontalSpacing, y + 4.0f, mPaint); 
      } 
      if (lp.breakLine) { 
       float x = child.getRight(); 
       float y = child.getTop() + child.getHeight()/2.0f; 
       canvas.drawLine(x, y, x, y + 6.0f, mPaint); 
       canvas.drawLine(x, y + 6.0f, x + 6.0f, y + 6.0f, mPaint); 
      } 
      return more; 
     } 

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

     @Override 
     protected LayoutParams generateDefaultLayoutParams() { 
      return new LayoutParams(LayoutParams.WRAP_CONTENT, 
        LayoutParams.WRAP_CONTENT); 
     } 

     @Override 
     public LayoutParams generateLayoutParams(AttributeSet attrs) { 
      return new LayoutParams(getContext(), attrs); 
     } 

     @Override 
     protected LayoutParams generateLayoutParams(ViewGroup.LayoutParams p) { 
      return new LayoutParams(p.width, p.height); 
     } 

     public static class LayoutParams extends ViewGroup.LayoutParams { 
      int x; 
      int y; 

      public int horizontalSpacing; 
      public boolean breakLine; 

      public LayoutParams(Context context, AttributeSet attrs) { 
       super(context, attrs); 
       TypedArray a = context.obtainStyledAttributes(attrs, 
         R.styleable.FlowLayout_LayoutParams); 
       try { 
        horizontalSpacing = a 
          .getDimensionPixelSize(
            R.styleable.FlowLayout_LayoutParams_layout_horizontalSpacing, 
            -1); 
        breakLine = a.getBoolean(
          R.styleable.FlowLayout_LayoutParams_layout_breakLine, 
          false); 
       } finally { 
        a.recycle(); 
       } 
      } 

      public LayoutParams(int w, int h) { 
       super(w, h); 
      } 
     } 
    } 

XML을 사용 여기

<com.shashi.app.utils.FlowLayout 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:paddingLeft="15dp" 
      android:paddingRight="15dp" 
      app:horizontalSpacing="10dp" 
      app:verticalSpacing="10dp" > 
your views here 
</com.shashi.app.utils.FlowLayout>