2012-03-11 38 views
0

我试图以编程方式构建Android视图的一部分,但不幸的是,我在RelativeLayout中遇到了一些问题。它使我的Elements上海誓山盟RelativeLayout元素不正确重叠

覆盖这是我的代码:

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.insertnew_layout); 
    LinearLayout ll = (LinearLayout) findViewById(R.id.container); 

    ll.setOrientation(LinearLayout.VERTICAL); 
    TableLayout tl = new TableLayout(this); 
    tl.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT)); 


     // fill content 
     for (int i = 0; i < 3; i++) { 

     TableRow tr = new TableRow(this); 
     tr.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT)); 

     RelativeLayout rl = new RelativeLayout(this); 
     rl.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT)); 

     TextView score = new TextView(this); 
     score.setText(""+i); 
     RelativeLayout.LayoutParams lpScore = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.FILL_PARENT); 
     lpScore.addRule(RelativeLayout.ALIGN_PARENT_LEFT); 
     score.setLayoutParams(lpScore); 

     TextView description = new TextView(this); 
     description.setText("this is my description"); 
     RelativeLayout.LayoutParams lpDescription = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.FILL_PARENT); 
     lpDescription.addRule(RelativeLayout.RIGHT_OF, score.getId()); 

     description.setLayoutParams(lpDescription); 

     CheckBox checkbox = new CheckBox(this); 
     RelativeLayout.LayoutParams lpCheckbox = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.FILL_PARENT); 
     lpCheckbox.addRule(RelativeLayout.ALIGN_PARENT_RIGHT); 
     checkbox.setLayoutParams(lpCheckbox); 

     rl.addView(score); 
     rl.addView(description); 
     rl.addView(checkbox); 
     tl.addView(rl); 

    } 

    ll.addView(tl); 

这是什么样子:

output in javacode

正如你所看到的,“说明”是对“得分”的顶部。

这里是XML格式的同一代码:

<TableLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="fill_parent" 
android:layout_height="fill_parent" 
android:id="@+id/tableLayoutTextEntry" > 

<TableRow 
    android:id="@+id/tableRowTextEntry" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" > 

    <RelativeLayout 
     android:id="@+id/relativeLayout1" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" > 

     <TextView 
      android:id="@+id/score" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_alignParentLeft="true" 
      android:text="score" /> 

     <TextView 
      android:id="@+id/description" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_toRightOf="@+id/score" 
      android:text="description" /> 

     <CheckBox 
      android:id="@+id/checkBox" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_alignParentRight="true" 
      android:text="select" /> 

    </RelativeLayout> 

</TableRow> 

</TableLayout> 

这里是什么样子的XML:

output in xml

正如你可以看到,在XML中,toRightOf命令按预期工作 - 描述是在得分右侧

这怎么可能?不应该行

lpDescription.addRule(RelativeLayout.RIGHT_OF, score.getId());

做同样的事情?

+0

您是否需要在代码中创建布局? – Egor 2012-03-11 12:40:56

+0

@Egor是的,即使他可以通过定义**自定义适配器ListView ** – 2012-03-11 12:45:25

回答

1

在你调用它的那一刻,score.getId()将返回-1(无效),因为它还没有被添加到整个布局处理的屏幕上。 您必须在致电getId()之前手动设置ID号码setId(),它应该都可以正常工作。