【问题标题】:Android: failed to setContentView when switching to ListActivityAndroid:切换到 ListActivity 时 setContentView 失败
【发布时间】:2010-03-31 00:17:40
【问题描述】:

[update] 我收到错误消息,上面写着“您的内容必须有一个 id 属性为 'android.R.id.list' 的 ListView”。显然,我的 xml 中没有任何内容是 ListView。但这是必需的吗?

这是我上一个问题的后续问题 android: which view should I use for showing text and image?

我阅读了有关为 LinearLayout 创建 ListView 的文章。但是,当我将“扩展 Activity”更改为“扩展 ListActivity”时,我的以下代码在 setContentView() 函数中失败,知道为什么吗?

private TextView mSelection;
//private ImageView mImages;
static final String[] keywords = new String[]{"China", "Japan", "USA", "Canada"};
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.contactLayout);

    mSelection = (TextView)findViewById(R.id.ContactNames);
    ArrayAdapter adapter = new ArrayAdapter<String>(this, R.layout.contactlayout, R.id.ContactNames,keywords);
    setListAdapter(adapter);
    }

我的布局来自这篇文章:http://www.curious-creature.org/2009/02/22/android-layout-tricks-1/

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="?android:attr/listPreferredItemHeight"

android:padding="6dip">

<ImageView
    android:id="@+id/icon"

    android:layout_width="wrap_content"
    android:layout_height="fill_parent"
    android:layout_marginRight="6dip"

    android:src="@drawable/icon" />

<LinearLayout
    android:orientation="vertical"

    android:layout_width="0dip"
    android:layout_weight="1"
    android:layout_height="fill_parent">

    <TextView
        android:id="@+id/ContactNames"
        android:layout_width="fill_parent"
        android:layout_height="0dip"
        android:layout_weight="1"

        android:gravity="center_vertical"
        android:text="My Application" />

    <TextView
        android:layout_width="fill_parent"
        android:layout_height="0dip"
        android:layout_weight="1" 

        android:singleLine="true"
        android:ellipsize="marquee"
        android:text="Simple application that shows how to use RelativeLayout" />

</LinearLayout>

【问题讨论】:

    标签: android layout listactivity


    【解决方案1】:

    我认为您误解了我在上一个问题中向您展示的其他帖子。他们正在解释如何为列表中的每一行使用自定义布局,而不是如何为活动定义整个布局文件。你需要这样的东西:

    (main.xml)
    <?xml version="1.0" encoding="utf-8"?>
    <ListView xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:cacheColorHint="#00000000"
        android:id="@android:id/list">
    </ListView>
    

    注意非常重要的行android:id="@android:id/list"。您必须在您的 ListView 中包含它,因为这会告诉 Android 您的列表在哪里。如果您的背景不是黑色,则 cacheColorHint 很有用 - 有关详细信息,请参阅 this post

    通过以上几行,您可以为您的活动提供一个可以正确识别的列表。这是一个基本示例:

    public class TestProject extends ListActivity {
    
        final static String[] ITEMS = {"blah", "floop", "gnarlp", "stuff"};
    
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
            ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
                    R.layout.listrow, R.id.textview, ITEMS);
            setListAdapter(adapter);
        }
    }
    

    那么listrow布局就是这样的:

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content">
    
        <TextView android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/textview"/>
    </LinearLayout>
    

    这是一个非常简单的布局。如果你想得到更复杂的东西,改变是你必须使用 BaseAdapter,因为这让你在每一行之前调用getView(...)。您可以根据每行的内容使用不同的布局。但是,当您第一次尝试 BaseAdapter 时,它看起来很吓人,因此请注意! :)

    【讨论】:

    • 谢谢我试过了,它确实提供了一个项目列表。但是,为什么在这种情况下文本都是空的?
    • 它们对我来说不是空的......你能更新你上面发布的代码吗?如果您仍在使用 ArrayAdapter adapter = new ArrayAdapter&lt;String&gt;(this, R.layout.contactlayout, R.id.ContactNames,keywords); 行,这可能是一个错误。我使用的效果很好 - 我确保在在线发布之前对其进行测试。
    • 有趣!使用您的布局,文本不为空。但是我上面列出的布局变成了空的!知道为什么吗?
    • 更多有趣的列表,你应该扩展BaseAdapter。但正如我上面所写,这需要更多的代码。一旦你理解了它在做什么,它实际上并没有那么复杂,但它确实需要一点耐心,并且需要大量的试验和错误才能让它正确。在你完全理解这个简单的列表发生了什么之前,当然不要尝试它。这可能会让你感到困惑......
    • 这是另一个列表教程,看起来比我最初给你的更容易阅读:softwarepassion.com/…
    【解决方案2】:

    是的,如果你使用 ListActivity,你需要在你的布局文件中有一个 ID 为 android.R.list 的 ListView。

    如果您没有在布局中使用 ListView,并且我在其中没有看到,请切换到使用常规 Activity。

    【讨论】:

    • 如果我设置回 Activity,我应该如何调用 setListAdapter 来获取新项目列表?
    • 如果你没有列表视图,那么调用 setListAdapter() 是没有意义的——没有列表视图可以显示你给它的任何适配器!
    • 那基本上你是说这篇经典文章是错的? androidguys.com/2008/07/14/fancy-listviews-part-one我正在尝试创建一个项目列表视图,其中包含每个项目的图标和文本。
    • 我不知道你怎么看那篇文章。格式太可怕了。无论哪种方式,如果您的布局 xml 文件中没有 ListView,您就不能使用 ListActivity 获得项目列表,而且您肯定会错过。
    • 我确实看到很多类似的帖子,而且人们肯定在使用没有 ListView 的 ListActivity:stackoverflow.com/questions/2451744/…
    【解决方案3】:

    实际上,您的(自定义)布局在使用列表活动时不需要 ListView。解决这个问题的简单方法是完全删除 setContentView() 行。简单来说,当您这样做时,Android 会“假定”您正在使用的布局来包含单个全屏 ListView,并为您提供它。

    如果您想要 Activity 的不同(更丰富)接口,则必须编写 XML 代码并使用 Android 的通知 ID 来了解如何显示作为 ListActivity 的 Activity 所隐含的列表。请注意,项目的布局与列表不同,虽然我没有尝试过,但我假设您可以拥有自定义项目布局,而无需在活动布局中使用显式 ListView。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多