2016-02-23 3 views
0

Я нашел пару способов сделать это, но моя проблема в том, что мой код должен быть LinearLayout с горизонтальной ориентацией. Итак, что происходит, динамически созданные TextViews выходят из экрана.Добавление TextViews программно

код у меня есть ниже:

mProductAttrLayout.setOrientation(LinearLayout.HORIZONTAL); 
    mProductAttrLayout.setLayoutParams(new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT)); 
    for (ProductAttribute productAttribute : aProductAttributes) { 
     String name = productAttribute.getName(); 
     TextView attr = new TextView(getContext()); 
     attr.setText(name); 
     attr.setPadding(8, 8, 8, 8); 
     attr.setLayoutParams(new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT)); 
     attr.setTextColor(getResources().getColor(R.color.black)); 
     mProductAttrLayout.addView(attr); 


     for (int i = 0; i < productAttribute.getValues().size(); i++) { 
     TextView value = new TextView(getContext()); 
     value.setText(productAttribute.getValues().get(i)); 
     value.setTextColor(getResources().getColor(R.color.black)); 
     value.setLayoutParams(new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT)); 
     value.setPadding(8, 8, 8, 8); 
     mProductAttrLayout.addView(value); 
     } 
    } 

То, что я в настоящее время является:

| имя: значение, значение, значение, val-- |

, что мне нужно что-то вроде:

имя: значение, значение (неизвестное количество значений)

, но мне нужно идти на следующую строку в экран, если он слишком широкий, как показано ниже:

| имя: значение, значение, значение, --- |

| значение, значение, значение. ------------ |

Надеюсь, вы поймете, что мне нужно?

+0

Что означает «перейти на следующий экран»? Ваше искусство ASCII предполагает, что вы имеете в виду «перейти к следующей строке». В этом случае я бы рекомендовал либо иметь только один «TextView», либо использовать что-то вроде макета потока, из которых [существует несколько реализаций для Android] (http://android-arsenal.com/search?q=flowlayout). – CommonsWare

+1

Используйте макет потока, чтобы обрабатывать несколько текстовых объектов в одном макете (это будет работать как средство отображения содержимого макета). https://github.com/ApmeM/android-flowlayout –

+0

Окно компоновки потока выглядит как решение, но я немного потерял о том, как добавить представления в макет потока? это похоже на flowlayout.addView (view)? – x10sion

ответ

0

Я знаю, что это старый вопрос, который я спросил давно, но они (Google) дали нам решение к этой проблеме, используя FlexboxLayout с атрибутом flexWrap="wrap".

Это для всех, кто находит этот вопрос с той же проблемой.

Пример в XML:

<com.google.android.flexbox.FlexboxLayout 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     app:flexWrap="wrap" /> 

Для получения дополнительной информации вы можете посетить GitHub репо здесь FlexboxLayout Repo

Это работает так:

enter image description here

можете прочитать больше здесь:

Build flexible layouts with FlexboxLayout

1

LinearLayout - неправильный выбор здесь.

Вы можете либо написать свой собственный макет, либо использовать существующую работу.

Что вы, вероятно, хотите, обычно называют FlowLayout, например this.

Пользовательские макеты могут использоваться как любые другие макеты. Например. вы можете добавлять виды с помощью layout.addView. Норамли единственная разница в использовании отражается в обычае layoutParams.

+0

Спасибо, я пошел с FlowLayout – x10sion

0

Создание макета потока в OnCreate: -

muscle_gp_tag_flow_layout = new FlowLayout(mContext); 
    //add the flow layout to your main layout 

вызов метода в первый раз, и всякий раз, когда вы хотите, чтобы обновить вид: -

public void createShowSpannableStringMuscleGroup(List<MuscleGroup> muscleGroups) { 

     // clears the flowlayout views 
     muscle_gp_tag_flow_layout.removeAllViews(); 
     for (int countGroup = 0; countGroup < muscleGroups.size(); countGroup++) { 
      MuscleGroup group = muscleGroups.get(countGroup); 
      if (group.getName() != null && group.getName().length() > 0) { 

//    inflating the textview views in flow layout 
       TextView textView=new textView(context); 
//set color, background for textview 
       textView.setText(group.getName().toString()); 

//    adding views to flowlayout muscle group 
       muscle_gp_tag_flow_layout.addView(mView); 
      } 
     } 
0

вы можете использовать SpannableStringBuilder и TextAppearanceSpan.Пример кода:

 List<String> manyStrings = Arrays.asList(new String[]{"name", "value", "value", "value"}); 
     TextView textView = (TextView) view.findViewById(R.id.textView); 
     SpannableStringBuilder spannableStringBuilder = new SpannableStringBuilder(); 
     for (int i = 0; i < manyStrings.size(); i++) { 
      String text; 
      if (i == 0) { 
       text = manyStrings.get(i) + ": "; 
      } else if (i == manyStrings.size() - 1) { 
       text = manyStrings.get(i); 
      } else { 
       text = manyStrings.get(i) + ", "; 
      } 

      if (i == 0) { 
       spannableStringBuilder.append(text); 
       spannableStringBuilder.setSpan(new TextAppearanceSpan(getActivity(), android.R.style.TextAppearance_DeviceDefault_Large), 0, text.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); 
      } else { 
       int oldLength = spannableStringBuilder.length(); 
       spannableStringBuilder.append(text); 
       spannableStringBuilder.setSpan(new TextAppearanceSpan(getActivity(), android.R.style.TextAppearance_DeviceDefault_Small), oldLength, spannableStringBuilder.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); 
      } 
     } 

     textView.setText(spannableStringBuilder); 

Подробнее о SpannableStringBuilder и TextAppearanceSpan: http://developer.android.com/reference/android/text/SpannableStringBuilder.html http://developer.android.com/reference/android/text/style/TextAppearanceSpan.html

Смежные вопросы