显示基于XML的布局和动态添加文本的问题

时间:2009-09-12 10:27:17

标签: xml android layout

我在XML中定义了一个LinearLayout,我想重复使用它来显示列表的元素。 XML布局如下所示:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:background="@drawable/background"
android:paddingBottom="5px"
>
<TextView  
android:id="@+id/destination"
android:layout_width="fill_parent" 
android:layout_height="wrap_content"
android:textSize="22dp"
android:text="@string/test_destination"
android:paddingLeft="5px"
/>

<TextView  
android:id="@+id/date"
android:layout_width="fill_parent" 
android:layout_height="wrap_content"
android:textSize="15dp"
android:text="@string/test_date"
android:paddingLeft="5px"
/>

<TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/info"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:paddingLeft="5px"
android:paddingTop="10px" 
>
    <TableRow>
        <TextView
            android:id="@+id/reg_label"
            android:gravity="right"
            android:paddingRight="5px"
            android:text="@string/reg_label" />
        <TextView
            android:text="@string/test_registered"/>
    </TableRow>
    <TableRow>
        <TextView
            android:id="@+id/info_label"
            android:gravity="right"
            android:paddingRight="5px"
            android:text="@string/info_label" />
        <TextView
            android:text="@string/test_info"/>
    </TableRow>
</TableLayout> 
</LinearLayout>

我从网页收集有关某些事件的信息,然后我想使用上述布局为每个事件显示列表中的所有事件。我目前的方法是将LinearLayout作为父级,然后将每个事件添加为一行。

问题一是将布局添加到每个事件(事件数量不同)。即,我想为每个事件动态扩充此布局。我也不希望将文本硬编码到布局中(如上所述),而是在运行时添加。我不知道该怎么做。我尝试过类似下面的内容但没有任何成功。

LinearLayout eventView = (LinearLayout) findViewById(R.layout.event);
parentView.addView(eventView);

问题二是将这些布局添加到父视图组并在屏幕上显示。当我尝试使用parent.addView(child)执行此操作时,程序在运行时崩溃,我无法弄清楚原因。

有点难以描述具体问题,因为我刚接触Android上的GUI编程,而我现在正在通过反复试验进行编程。无论如何,如果你能够帮助我解决一些问题,我们将不胜感激。

莱纳斯

编辑:

感谢commonsware,现在视图正确膨胀。现在的问题是动态地向TextViews添加文本。我试试这个:

TextView dest = (TextView) findViewById(R.id.destination);
dest.setText("myText");

只发现dest为null。任何想法为什么以及如何解决这个问题?

编辑2:

我已经把问题缩小了,但我真的不明白它的本质。这是麻烦的方法:

private void formatEvents(ArrayList<Event> events, LinearLayout parentView) {
    Log.d(TAG, "formatEvents, size: " + events.size());
    for (Event event : events) {

        LinearLayout eventView = new LinearLayout(this);
        eventView = (LinearLayout) getLayoutInflater().inflate(R.layout.event, null);
        parentView.addView(eventView);

        TextView dest = (TextView) findViewById(R.id.destination);
        TextView date = (TextView) findViewById(R.id.date);
        TextView registered = (TextView) findViewById(R.id.registered);
        TextView info = (TextView) findViewById(R.id.info);
        if (dest == null)
            Log.d(TAG, "null");
        else {
            Log.d(TAG, "not null");
            dest.setText(event.getDestination());
            date.setText(event.getDate());
            registered.setText(event.getDriver() + " " + event.getPassengers());
            info.setText(event.getInfo());
        }
    }       
}

第一次迭代我得到null,但第二次迭代得不到。当我改变

parentView.addView(eventView);

parentView.addView(eventView, 0);

它以某种方式工作(即使事件以相反的顺序显示)。谁知道这里发生了什么?

2 个答案:

答案 0 :(得分:1)

总的来说,我建议您使用ListView而不是LinearLayout作为行的容器。

  

问题一是添加   每个事件的布局(数量)   事件是变化的)。即,我想   动态扩充此布局   每个事件。

parentView.addView(getLayoutInflater().inflate(R.layout.this_is_my_row));

答案 1 :(得分:1)

ID“目的地”是否属于布局“事件”?

如果是这样,那么

TextView dest = (TextView) findViewById(R.id.destination);
应该是

TextView dest = (TextView) eventView.findViewById(R.id.destination);