2014-01-17 3 views
-1

Я строю простой список из двух столбцов в android и должен динамически заполнять количество строк. Макет xml работает отлично, но когда я пытаюсь построить макет программно, второй столбец не отображается. Есть идеи?программный макет android

private void addRow(String text, String value) { 
    RelativeLayout line = new RelativeLayout(this); 

    line.setLayoutParams(new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.FILL_PARENT, RelativeLayout.LayoutParams.WRAP_CONTENT)); 

    RelativeLayout.LayoutParams rlp = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT); 
    rlp.addRule(RelativeLayout.ALIGN_PARENT_LEFT); 
    rlp.addRule(RelativeLayout.CENTER_VERTICAL); 

    line.setPadding(0, 0, 0, 15); 

    TextView caption = new TextView(this); 
    caption.setLayoutParams(rlp); 
    caption.setTextSize(TypedValue.COMPLEX_UNIT_PX, 30); 
    caption.setText(text); 

    rlp = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT); 
    rlp.addRule(RelativeLayout.ALIGN_PARENT_RIGHT); 
    rlp.addRule(RelativeLayout.CENTER_VERTICAL); 

    TextView val = new TextView(this); 
    val.setLayoutParams(rlp); 
    val.setTextColor(0x05b4e4); 
    val.setTextSize(TypedValue.COMPLEX_UNIT_PX, 30); 
    val.setText(value); 

    line.addView(caption); 
    line.addView(val); 

    mLayout.addView(line); 
} 

Аналогичный XML для одной строки (который работает) это

<RelativeLayout 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:paddingBottom="15px" > 

     <TextView 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:textSize="30px" 
      android:text="What" 
      android:layout_alignParentLeft="true" 
      android:layout_centerVertical="true" 
      /> 

     <TextView 
      android:id="@+id/txtClubPath" 
      android:textColor="#05b4e4" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:textSize="30px" 
      android:text="stuff" 
      android:layout_alignParentRight="true" 
      android:layout_centerVertical="true" 
      /> 

    </RelativeLayout> 

Опять - строки заполнения, но второй столбец не виден. Вот что происходит в:

<ScrollView xmlns:android="http://schemas.android.com/apk/res/android" 

android:id="@+id/scrollViewRoot" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:fillViewport="true" 
android:keepScreenOn="true"> 

<LinearLayout 
    android:id="@+id/viewRoot" 
    android:paddingTop="20px" 
    android:paddingBottom="40px" 
    android:paddingLeft="20px" 
    android:paddingRight="20px" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:orientation="vertical"> 

</LinearLayout> 

</ScrollView> 
+0

почему -1 рейтинг? – kolosy

ответ

0

Формуляром Params с точки зрения добавляемой должны быть LinearLayout.LayoutParams типа, потому что родитель будет иметь такого типа.

Эта линия

line.setLayoutParams(new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.FILL_PARENT, RelativeLayout.LayoutParams.WRAP_CONTENT)); 

должен стать

line.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.FILL_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT)); 

Однако, я думаю, что это должно вызвать исключение, если что-нибудь.

+0

Вы правы, так оно и должно быть. К сожалению, это не устранило проблему. – kolosy

0

Для детей RelativeLayout важно иметь уникальный ненулевой идентификатор.

Вы могли бы, по API 17+, используйте

myView.setId(View.generateViewId()); 

Или если у вас есть для поддержки старых уровней API, можно использовать (и увеличивает каждый раз) простое статическое значение AtomicInteger.

+0

Без эффекта. Пробовал AtomicInteger, установленный в 'Integer.MAX_VALUE - 1000', но никакого эффекта. – kolosy

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