Android抱怨内容没有Listview与id android.R.id.List尽管有这个

时间:2014-11-24 02:31:56

标签: android listview android-listview r.java-file

显然不是一个深刻的问题,但我认为这可能是我的方法中的一个错误。

所以我已将文件listview.xml添加到布局文件夹中的项目中。

它包含这个:

<?xml version="1.0" encoding="utf-8"?>
<ListView android:id="@+id/android:list"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    xmlns:android="http://schemas.android.com/apk/res/android" />

我也尝试过:

<?xml version="1.0" encoding="utf-8"?>
<ListView android:id="@android:id/list"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    xmlns:android="http://schemas.android.com/apk/res/android" />

我的主要活动功能通常如下:

public class ToDoManagerActivity extends ListActivity {

private static final int ADD_TODO_ITEM_REQUEST = 0;
private static final String FILE_NAME = "TodoManagerActivityData.txt";
private static final String TAG = "Lab-UserInterface";

// IDs for menu items
private static final int MENU_DELETE = Menu.FIRST;
private static final int MENU_DUMP = Menu.FIRST + 1;

ToDoListAdapter mAdapter;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    // Create a new TodoListAdapter for this ListActivity's ListView
    mAdapter = new ToDoListAdapter(getApplicationContext());

    // Put divider between ToDoItems and FooterView
    getListView().setFooterDividersEnabled(true);

    // TODO - Inflate footerView for footer_view.xml file         
    TextView footerView = (TextView) getLayoutInflater().inflate(R.layout.footer_view, null);

    // NOTE: You can remove this block once you've implemented the assignment
    if (null == footerView) {
        return;
    }
    // TODO - Add footerView to ListView
    getListView().addFooterView(footerView);
    setListAdapter(mAdapter);

    setContentView(R.layout.footer_view);

这样可以解决错误:

...java.lang.RunTimeException: content must have a ListView whose id attribute is 'android.R.id.list'

我注意到,如果我注释掉setContentView(R.layout.footer_view)位,则错误消失,这也很混乱,因为看起来错误应该在那之前触发。

这让我感到困惑,因为据我所知,这个元素存在。看起来我可能错过了加载ListView的步骤?我在这里碰到了我的头撞墙,这看起来像是非常基本的东西,而且非常糟糕......所以任何帮助都非常感谢!

干杯!

编辑:

footer_view.xml内容:

<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/footerView"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:gravity="center_horizontal"
    android:text="@string/add_new_todo_item_string"
    android:textSize="24sp" >

</TextView>

EDIT2:

建议编辑后的当前onCreate:

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    // Create a new TodoListAdapter for this ListActivity's ListView
    mAdapter = new ToDoListAdapter(getApplicationContext());

    // Put divider between ToDoItems and FooterView
    getListView().setFooterDividersEnabled(true);

    setListAdapter(mAdapter);
    TextView footerView = (TextView) getLayoutInflater().inflate(R.layout.footer_view, getListView(), false);
    getListView().addFooterView(footerView);
}

2 个答案:

答案 0 :(得分:1)

对于扩展ListActivity的Activity,ListView需要存在于您在活动中使用的xml文件中,如果是footer_view文件。

取自Google Dev Site - &#34; ListActivity的默认布局包含屏幕中央的单个全屏列表。但是,如果需要,可以通过在onCreate()中使用setContentView()设置自己的视图布局来自定义屏幕布局。 To do this, your own view MUST contain a ListView object with the id "@android:id/list"&#34;

要将您的页脚合并到列表下方,请尝试以下操作:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <ListView
        android:id="@android:id/list"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1" />

    <TextView
        android:id="@+id/footerView"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center_horizontal"
        android:text="@string/add_new_todo_item_string"
        android:textSize="24sp" >

    </TextView>
</LinearLayout>

答案 1 :(得分:1)

在这里,请在您的布局中尝试:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

        <ListView
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:background="@android:color/black"
            android:id="@android:id/list" />

</LinearLayout>

这正是我在我的应用中所拥有的。

然后在你的onCreate(),就是这个:

setContentView(R.layout.activity_main);

尝试一下,让我知道它是否有效。该代码应该工作。从那里,我们可以继续隔离问题。

编辑:

伙计,现在我看到了你的问题。这里没什么大不了的。让我们看一下你的代码(编辑得更短)。 onCreate()方法有:

super.onCreate(savedInstanceState);
mAdapter = new ToDoListAdapter(getApplicationContext());
getListView().setFooterDividersEnabled(true);      
TextView footerView = (TextView) getLayoutInflater().inflate(R.layout.footer_view, null);
getListView().addFooterView(footerView);
setListAdapter(mAdapter);
setContentView(R.layout.footer_view);

你在那里看到R.layout.activity_main吗?这是你的问题!您的R.layout.footer_view仅包含文本视图,但不包含ListView,并且您的活动会一直在寻找您承诺的ListView ListActivity。{{1} }}。

试试这个 - 将onCreate()方法更改为:

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    mAdapter = new ToDoListAdapter(getApplicationContext());
    setListAdapter(mAdapter);
}

然后您的activity_main.xml布局文件应如下所示:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

        <ListView
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:background="@android:color/black"
            android:id="@android:id/list" />

</LinearLayout>

这应该有效。让我知道。

EDIT2:

现在将其添加到onCreate()方法的末尾:

 TextView footerView = (TextView) getLayoutInflater().inflate(R.layout.footer_view, null);
getListView().addFooterView(footerView);

瞧!现在应该工作。