在列表片段和新片段之间切换

时间:2014-05-06 07:04:35

标签: android android-fragments

我无法让我的头脑切换一个List Fragment和一个新片段。

我的解释技巧不是很好,但希望这张粗略的图片能让我知道我想要完成什么。

http://imgur.com/12O5KKx

当我尝试将我的ListFragment更改为我的新片段时,我收到以下错误

java.lang.UnsupportedOperationException: addView(View) is not supported in AdapterView

这是logcat中的输出。

05-06 03:01:28.740    2578-2578/sqlite.testing.sqlitetest2.app E/AndroidRuntime﹕ FATAL EXCEPTION: main
Process: sqlite.testing.sqlitetest2.app, PID: 2578
java.lang.UnsupportedOperationException: addView(View) is not supported in AdapterView
        at android.widget.AdapterView.addView(AdapterView.java:452)
        at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:949)
        at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1115)
        at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:682)
        at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1478)
        at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:446)
        at android.os.Handler.handleCallback(Handler.java:733)
        at android.os.Handler.dispatchMessage(Handler.java:95)
        at android.os.Looper.loop(Looper.java:136)
        at android.app.ActivityThread.main(ActivityThread.java:5017)
        at java.lang.reflect.Method.invokeNative(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:515)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
        at dalvik.system.NativeStart.main(Native Method)

我的列表片段如下

public class StaticCategoryFragment extends ListFragment {

StaticCategoryDataSource dataSource;
ArrayList<StaticCategory> categories;

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

    dataSource = new StaticCategoryDataSource(getActivity());

    try {

        dataSource.open();

        categories = dataSource.getAllCategorys();
        ArrayAdapter<StaticCategory> adapter = new ArrayAdapter<StaticCategory>(getActivity(), android.R.layout.simple_list_item_1, categories);
        setListAdapter(adapter);

        dataSource.close();
    } catch (SQLException e) {
        e.printStackTrace();
    }
}

@Override
public void onListItemClick(ListView l, View v, int position, long id) {
    StaticCategory clickedCategory = categories.get(position);
    int categoryID = clickedCategory.getId();


    Fragment contentFrag = new BlankFragmentC();

    Bundle data = new Bundle();
    data.putInt("categoryID", categoryID);

    contentFrag.setArguments(data);

    final FragmentTransaction ft = getFragmentManager().beginTransaction();
    ft.replace(android.R.id.list, contentFrag);
    ft.addToBackStack(null);
    ft.commit();
}

}

和xml

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="sqlite.testing.sqlitetest2.app.StaticCategoryFragment">


<ListView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:id="@android:id/list" />

 </FrameLayout>

我想知道是否有人可以指出我做错了什么,并且可能会指出一些文档的方向以便更好地理解。

谢谢。

3 个答案:

答案 0 :(得分:0)

造成问题的一行是

  

ft.replace(android.R.id.list,contentFrag);

您应该id提供replace的第一个参数,即Activity托管Fragment

的容器ID

答案 1 :(得分:0)

您尝试使用新片段替换ListView。这就是问题

ft.replace(android.R.id.list, contentFrag);

你能做什么:

1)添加到.xml文件:

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="sqlite.testing.sqlitetest2.app.StaticCategoryFragment">


    <ListView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@android:id/list" />

    <FrameLayout 
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/container"/>

</FrameLayout>

然后使用:

ft.replace(R.id.container, contentFrag);

2)最好的解决方案 在此活动中创建活动并切换2个片段。 即显示在活动%list_fragment%中。在列表项上单击“发送消息”到活动,告诉您要切换片段(使用回调),然后在活动中切换片段

希望有所帮助

答案 2 :(得分:0)

碎片总是需要加载一些布局。您无法将片段加载到View中。你需要任何布局。您可以使用FrameLayout加载您的片段。在您的代码中,您尝试将片段加载到ListView中,这是不可能的。

ListView总是需要可以将数据绑定到其中的适配器类。而您正在尝试将整个Fragment加载到其中。

创建一个Adapter类以将数据绑定到ListView,或者加载Fragment,其中包含ListView并仅绑定该片段中的数据。