Intereting Posts
Почему образец документации делится на 2 для вычисления inSampleSize для загрузки Bitmap? Как включить / отключить bluetooth программно в android ImageView в круге через xml Как подключить источник к API Google Диска или «Частная библиотека Android» в Eclipse Соединения базы данных Android и курсоры oh my Как получить прямое расстояние между двумя местами в андроиде? Genymotion. Как вытащить базу данных с устройства. Папка my / data / data / кажется пустой Настройка автоматического поворота Android на прослушиватель изменений Z порядок в xml android Как я могу развернуть / выполнить приложение на удаленном компьютере с помощью adb (инструменты платформы Android)? Как урезать TextView, а затем добавить эллипсис в Android Управление музыкальным проигрывателем в уведомлении Андроид простой белый фон без градиента Сделайте линейную компоновку, выбранную как элемент списка в виде списка (Android) Как вы можете отлаживать телефон, который у вас нет?

Добавьте несколько textViews (переменной ширины) в relativeLayout один за другим

У меня есть относительный макет. Внутри него я должен программно добавить несколько интерактивных текстовых просмотров, которые могут различаться по ширине. Мне нужно, чтобы они появлялись один за другим. Если textView имеет такую ​​ширину, что он не может поместиться в оставшееся пространство текущей строки, он должен начать заполняться ниже строки аналогичным образом.

Мне нужно что-то вроде этого: Иллюстрации того, что я хочу

До сих пор я понял этот код ниже:

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); } } } }); } 

Это делает работу частично. Он помещает textviews один за другим, но когда у меня недостаточно места, он не переносится в следующую строку. Я не могу придумать, как я могу это сделать.

Вот учебник, который объясняет, как вы можете это сделать .

Короче говоря, ваш класс должен быть чем-то вроде:

 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)); } } 

Почему бы вам не попробовать библиотеки, здесь я разделяю некоторые ссылки

Чипы Библиотека EditText
MultiTextTagView
TokenAutoComplete
Android-чипы

Эти библиотеки помогут вам достичь вашей продукции.