我无法让我的头脑切换一个List Fragment和一个新片段。
我的解释技巧不是很好,但希望这张粗略的图片能让我知道我想要完成什么。
当我尝试将我的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>
我想知道是否有人可以指出我做错了什么,并且可能会指出一些文档的方向以便更好地理解。
谢谢。
答案 0 :(得分:0)
造成问题的一行是
ft.replace(android.R.id.list,contentFrag);
您应该id
提供replace
的第一个参数,即Activity
托管Fragment
答案 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
并仅绑定该片段中的数据。