ListFragment给出了ListView,其id属性为'android.R.id.list'

时间:2013-06-26 18:08:30

标签: android android-listfragment

我正在尝试实现一个简单的列表/详细信息视图,如图1 here,但我得到一个“你的内容必须有一个ListView,其id属性为'android.R.id.list' “运行时异常。如果结果的数量可以通过,似乎已经详细讨论了这个错误,但大多数答案似乎是关于扩展ListActivity,而我正在扩展ListFragment。到目前为止,我没有运气来修复它。基本活动是:

SpeciesListActivity.java

public class SpeciesListActivity extends MenuItemActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_species_list);

        // Check if the species_detail view is available. If it is
        // we're running both fragments together.
        if (findViewById(R.id.species_detail) != null) {
        }
    }
}

片段通过其布局文件包含在内:

activity_species_list.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:baselineAligned="false"
    android:orientation="horizontal"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <fragment android:name="com.example.fragments.SpeciesListFragment"
            android:id="@+id/species_list"
            android:layout_weight="1"
            android:layout_width="0dp"
            android:layout_height="match_parent" />
    <fragment android:name="net.gamebreeder.fragments.SpeciesDetailFragment"
            android:id="@+id/species_detail"
            android:layout_weight="1"
            android:layout_width="0dp"
            android:layout_height="match_parent" />
</LinearLayout>

这是两个窗格布局,除了第二个片段(id species_detail)不包括在内之外,单个窗格是相同的。

有问题的片段:

SpeciesListFragment.java

public class SpeciesListFragment extends ListFragment {

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

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        return inflater.inflate(R.layout.fragment_species_list, container, false);
    }
}

片段的布局:

fragment_species_list.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingLeft="8dp"
    android:paddingRight="8dp">

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

    <TextView android:id="@id/android:empty"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:text="@string/empty_string"/>

</LinearLayout>

我已经尝试将SpeciesListFragment更改为不覆盖onCreateView()以强制它使用默认值,因为根据docs

  

注意:如果您的片段是ListFragment的子类,则默认实现从onCreateView()返回ListView,因此您不需要实现它。

但我仍然得到: java.lang.RuntimeException: Your content must have a ListView whose id attribute is 'android.R.id.list'

我发现的一个问题建议我确保我在主要活动中扩展FragmentActivity,这正是MenuItemActivity的原因:

public class MenuItemActivity extends FragmentActivity {

它基本上只是一个包装器,所以我不必在每个活动中手动创建菜单。

任何帮助都会受到赞赏 - 我希望我只是错过了一些简单的东西。

修改2013-06-27

我尝试将fragment_species_list.xml中的id格式化为@id/android:list@android:id/list,但都不起作用。文档说使用@id/android:list,但我读过的其他问题似乎表明两者都应该有效但我得到了两者的错误。我也试过了@+id/list

我还根据以下答案更改了以下内容:

activity_species_list.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:baselineAligned="false"
    android:orientation="horizontal"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <fragment class="com.example.fragments.SpeciesListFragment"
            android:id="@+id/species_list"
            android:layout_weight="1"
            android:layout_width="0dp"
            android:layout_height="match_parent" />
    <fragment class="net.gamebreeder.fragments.SpeciesDetailFragment"
            android:id="@+id/species_detail"
            android:layout_weight="1"
            android:layout_width="0dp"
            android:layout_height="match_parent" />
</LinearLayout>

6 个答案:

答案 0 :(得分:7)

将此包含添加到列表布局中:

<include layout="@android:layout/list_content" />
<ListView 
    android:id="@+id/list" 
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="@color/white" />

这对我有用....

Android网站上的文档:http://developer.android.com/reference/android/app/ListFragment.html

  

public View onCreateView(LayoutInflater inflater,ViewGroup   container,Bundle savedInstanceState)

     

在API级别11中添加提供默认实现以返回a   简单列表视图。子类可以覆盖以替换为自己的子类   布局。如果这样做,返回的视图层次结构必须具有ListView   其id为android.R.id.list ,并且可以选择具有兄弟视图   id列表为空时显示的android.R.id.empty。

     

如果您使用自己的自定义内容覆盖此方法,   考虑在布局中包含标准布局list_content   文件,以便您继续保留所有标准行为   ListFragment。特别是,这是目前唯一的方法   显示内置的不确定进展状态。

答案 1 :(得分:2)

我不确定究竟是什么造成了这个,但我设法通过删除最初使用ADT eclipse模板创建的所有旧片段,活动和布局文件来解决它。

我基本上从头开始重写所有内容,一次一件,以确保所有内容都被正确调用。我怀疑这只是因为所有引用都没有在编译的代码中更新,尽管多次清理所有编译的代码(手动和使用eclipse项目清理工具)。

答案 2 :(得分:-1)

您的fragment_species_list.xml应如下所示。你有“@ android / id:list”应该是“@ id / android:list”

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingLeft="8dp"
android:paddingRight="8dp">

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

<TextView android:id="@id/android:empty"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:text="@string/empty_string"/>

</LinearLayout> 

答案 3 :(得分:-1)

只需替换此xml文件

<?xml version="1.0" encoding="utf-8"?>
 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:baselineAligned="false"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="match_parent">

<fragment class="com.example.fragments.SpeciesListFragment"
        android:id="@+id/species_list"
        android:layout_weight="1"
        android:layout_width="0dp"
        android:layout_height="match_parent" />
<fragment class="net.gamebreeder.fragments.SpeciesDetailFragment"
        android:id="@+id/species_detail"
        android:layout_weight="1"
        android:layout_width="0dp"
        android:layout_height="match_parent" />
 </LinearLayout>

答案 4 :(得分:-2)

这可能是因为您正在使用

<ListView android:id="@android:id/list" 

尝试给予

 <ListView android:id="@+id/list" 

答案 5 :(得分:-3)

检查你的片段种类list.xml,那里

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

在你的listview中,id应该是android:id =&#34; @ + id / list&#34;