2016-07-21 11 views
5

Tôi có một phần bố cục tương đối. Trong đó, tôi phải lập trình thêm một số bản xem trước văn bản có thể nhấp có thể thay đổi về độ rộng. Tôi cần chúng xuất hiện cái khác. Nếu một textView có chiều rộng sao cho nó không thể vừa với không gian còn lại của hàng hiện tại, nó sẽ bắt đầu xuất hiện bên dưới hàng theo kiểu tương tự.Thêm một số textViews (có chiều rộng thay đổi) trong relativeLayout cái khác

tôi cần một cái gì đó như thế này: illustration of what i want

gì tôi đã được quản lý cho đến nay là mã này dưới đây:

public static void updateWordsListingOnUi(final ArrayList<String> wordsList) { //TODO: incomplete and may be inefficient 
    mUiHandler.post(new Runnable() { 
     @Override 
     public void run() { 
      TextView textView; 

      wordsListingContainer.removeAllViewsInLayout(); //TODO 
      for (final String word : wordsList) 
      { 
       textView = new TextView(context); 
       textView.setText(word); 
       textView.setClickable(true); 
       textView.setPadding(1,1,10,1); 
       if (wordsList.indexOf(word)%2 == 0) { 
        textView.setBackgroundColor(context.getResources().getColor(R.color.colorPrimary)); 
       } 
       else { 
        textView.setBackgroundColor(context.getResources().getColor(R.color.colorAccent)); 
       } 
       textView.setId(wordsList.indexOf(word)); //give IDs from 0 - (maxSize-1) 

       textView.setOnClickListener(new View.OnClickListener() { 

        @Override 
        public void onClick(View v) { 
         Toast.makeText(context, word, Toast.LENGTH_SHORT).show(); 
        } 
       }); 
       if(wordsList.indexOf(word) > 0) { 
        RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT); 
        layoutParams.addRule(RelativeLayout.RIGHT_OF, textView.getId()-1); //TODO 
        wordsListingContainer.addView(textView,layoutParams); 
       } 
       else { 
        wordsListingContainer.addView(textView); 
       } 

      } 
     } 
    }); 
} 

này không được công việc một phần. Nó đặt textviews cái này đến cái kia, nhưng khi có đủ không gian, nó sẽ không được xếp vào hàng kế tiếp. Tôi không thể nghĩ làm thế nào tôi có thể làm điều đó.

+1

đang có một số thư viện có thể giúp bạn với điều đó. Hầu hết sử dụng 1 chế độ xem văn bản tùy chỉnh trong đó u có thể "bọc bong bóng" các mục có thể nhấp riêng lẻ. Về điều đó, tôi nghĩ đây là https://github.com/eyeem/chips-android nhưng bạn có thể chắc chắn rằng Google sẽ có nhiều hơn thế. – Budius

Trả lời

3

Here is a tutorial, that explains how, you can do this.

Nói tóm lại, lớp học của bạn cần phải được cái gì đó như:

public class TagLayout extends ViewGroup { 
    int deviceWidth; 

    public TagLayout(Context context) { 
     this(context, null, 0); 
    } 

    public TagLayout(Context context, AttributeSet attrs) { 
     this(context, attrs, 0); 
    } 

    public TagLayout(Context context, AttributeSet attrs, int defStyleAttr) { 
     super(context, attrs, defStyleAttr); 
     init(context); 
    } 

    private void init(Context context) { 
     final Display display = ((WindowManager) context.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay(); 
     Point deviceDisplay = new Point(); 
     display.getSize(deviceDisplay); 
     deviceWidth = deviceDisplay.x; 
    } 

    @Override 
    protected void onLayout(boolean changed, int l, int t, int r, int b) { 
     final int count = getChildCount(); 
     int curWidth, curHeight, curLeft, curTop, maxHeight; 

     //get the available size of child view 
     final int childLeft = this.getPaddingLeft(); 
     final int childTop = this.getPaddingTop(); 
     final int childRight = this.getMeasuredWidth() - this.getPaddingRight(); 
     final int childBottom = this.getMeasuredHeight() - this.getPaddingBottom(); 
     final int childWidth = childRight - childLeft; 
     final int childHeight = childBottom - childTop; 

     maxHeight = 0; 
     curLeft = childLeft; 
     curTop = childTop; 

     for (int i = 0; i < count; i++) { 
      View child = getChildAt(i); 

      if (child.getVisibility() == GONE) 
       return; 

      //Get the maximum size of the child 
      child.measure(MeasureSpec.makeMeasureSpec(childWidth, MeasureSpec.AT_MOST), MeasureSpec.makeMeasureSpec(childHeight, MeasureSpec.AT_MOST)); 
      curWidth = child.getMeasuredWidth(); 
      curHeight = child.getMeasuredHeight(); 
      //wrap is reach to the end 
      if (curLeft + curWidth >= childRight) { 
       curLeft = childLeft; 
       curTop += maxHeight; 
       maxHeight = 0; 
      } 
      //do the layout 
      child.layout(curLeft, curTop, curLeft + curWidth, curTop + curHeight); 
      //store the max height 
      if (maxHeight < curHeight) 
       maxHeight = curHeight; 
      curLeft += curWidth; 
     } 
    } 

    @Override 
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 
     int count = getChildCount(); 
     // Measurement will ultimately be computing these values. 
     int maxHeight = 0; 
     int maxWidth = 0; 
     int childState = 0; 
     int mLeftWidth = 0; 
     int rowCount = 0; 

     // Iterate through all children, measuring them and computing our dimensions 
     // from their size. 
     for (int i = 0; i < count; i++) { 
      final View child = getChildAt(i); 

      if (child.getVisibility() == GONE) 
       continue; 

      // Measure the child. 
      measureChild(child, widthMeasureSpec, heightMeasureSpec); 
      maxWidth += Math.max(maxWidth, child.getMeasuredWidth()); 
      mLeftWidth += child.getMeasuredWidth(); 

      if ((mLeftWidth/deviceWidth) > rowCount) { 
       maxHeight += child.getMeasuredHeight(); 
       rowCount++; 
      } else { 
       maxHeight = Math.max(maxHeight, child.getMeasuredHeight()); 
      } 
      childState = combineMeasuredStates(childState, child.getMeasuredState()); 
     } 

     // Check against our minimum height and width 
     maxHeight = Math.max(maxHeight, getSuggestedMinimumHeight()); 
     maxWidth = Math.max(maxWidth, getSuggestedMinimumWidth()); 

     // Report our final dimensions. 
     setMeasuredDimension(resolveSizeAndState(maxWidth, widthMeasureSpec, childState), 
       resolveSizeAndState(maxHeight, heightMeasureSpec, childState << MEASURED_HEIGHT_STATE_SHIFT)); 
    } 
} 
Các vấn đề liên quan