gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 22:35:07 24 4
gpt4 key购买 nike

我有一个用 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);

第二个问题是将这些布局添加到父 View 组并将其显示在屏幕上。当我尝试使用 parent.addView(child) 执行此操作时,程序在运行时崩溃,我不知道为什么。

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

林纳斯

编辑:

感谢 commonsware,现在 View 可以正常膨胀了。现在的问题是向 TextViews 动态添加文本。我试试这个:

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

才发现dest为空。知道为什么以及如何解决这个问题吗?

编辑 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);

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

最佳答案

id“destination”是否属于layout“event”?

如果是这样的话,

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

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

关于xml - 显示基于 XML 的布局和动态添加文本的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1414812/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com