第一次使用 Fragment,当我尝试使用 fragmentTransaction 打开它时得到 "Application has stopped"
First time Fragment, and I got "Application has stopped" when I try open it with fragmentTransaction
在我的片段中 Activity 我这样做了:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
FragmentManager fragmentManager = getFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
principalFragment hello = principalFragment.newInstance();
fragmentTransaction.add(R.id.fragment_container, hello, hello.TAG);
fragmentTransaction.commit();
}
这是我要打开的片段
<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="plenumsoft.iniciativayucatan.ui.principal">
<RelativeLayout
android:layout_width="fill_parent"
android:layout_height="135dp"
android:background="@color/colorTerracota"
android:padding="15dp"
android:layout_centerVertical="true"
android:layout_centerHorizontal="true"
android:layout_gravity="center">
<Button
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/statetexas"
android:id="@+id/btnTexas"
android:width="100dp"
android:layout_alignParentBottom="true"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true" />
<Button
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/stateyucatan"
android:id="@+id/btnYucatan"
android:width="100dp"
android:layout_alignParentTop="true"
android:layout_alignLeft="@+id/btnTexas"
android:layout_alignStart="@+id/btnTexas" />
</RelativeLayout>
</FrameLayout>
如果我创建一个新片段,我会得到相同的结果(默认情况下 android studio 使用 "hello blank fragment")
如果我将 <fragment>
添加到 activity
,我会得到相同的结果
是logcat
01-06 06:21:00.990 3196-3196/? D/dalvikvm: Late-enabling CheckJNI
01-06 06:21:01.290 3196-3196/soft.ini W/ActivityThread: Application soft.ini is waiting for the debugger on port 8100...
01-06 06:21:01.310 3196-3196/soft.ini I/System.out: Sending WAIT chunk
01-06 06:21:01.450 3196-3203/soft.ini I/dalvikvm: Debugger is active
01-06 06:21:01.510 3196-3196/soft.ini I/System.out: Debugger has connected
01-06 06:21:01.510 3196-3196/soft.ini I/System.out: waiting for debugger to settle...
01-06 06:21:01.711 3196-3196/soft.ini I/System.out: waiting for debugger to settle...
01-06 06:21:01.911 3196-3196/soft.ini I/System.out: waiting for debugger to settle...
01-06 06:21:02.111 3196-3196/soft.ini I/System.out: waiting for debugger to settle...
01-06 06:21:02.311 3196-3196/soft.ini I/System.out: waiting for debugger to settle...
01-06 06:21:02.511 3196-3196/soft.ini I/System.out: waiting for debugger to settle...
01-06 06:21:02.711 3196-3196/soft.ini I/System.out: waiting for debugger to settle...
01-06 06:21:02.912 3196-3196/soft.ini I/System.out: waiting for debugger to settle...
01-06 06:21:03.112 3196-3196/soft.ini I/System.out: debugger has settled (1428)
01-06 06:21:03.602 3196-3196/soft.ini D/roboguice.RoboGuice: Using annotation database(s).
01-06 06:21:03.612 3196-3196/soft.ini D/roboguice.RoboGuice: Using annotation database(s) : [, roboguice]
01-06 06:21:03.632 3196-3196/soft.ini D/roboguice.RoboGuice: Time spent loading annotation databases : 17
01-06 06:21:03.783 3196-3198/soft.ini D/dalvikvm: GC_CONCURRENT freed 302K, 13% free 9449K/10823K, paused 16ms+13ms, total 74ms
01-06 06:21:04.623 3196-3198/soft.ini D/dalvikvm: GC_CONCURRENT freed 357K, 14% free 9539K/11015K, paused 19ms+23ms, total 113ms
01-06 06:21:05.895 3196-3196/soft.ini D/dalvikvm: GC_FOR_ALLOC freed 52K, 14% free 9557K/11015K, paused 57ms, total 63ms
01-06 06:21:06.195 3196-3196/soft.ini I/dalvikvm-heap: Grow heap (frag case) to 26.000MB for 16384016-byte allocation
01-06 06:21:06.345 3196-3198/soft.ini D/dalvikvm: GC_CONCURRENT freed <1K, 6% free 25557K/27079K, paused 12ms+6ms, total 146ms
01-06 06:21:06.345 3196-3203/soft.ini D/dalvikvm: WAIT_FOR_CONCURRENT_GC blocked 50ms
01-06 06:21:06.445 3196-3196/soft.ini D/dalvikvm: GC_FOR_ALLOC freed <1K, 6% free 25557K/27079K, paused 20ms, total 20ms
01-06 06:21:06.605 3196-3196/soft.ini I/dalvikvm-heap: Grow heap (frag case) to 61.156MB for 36864016-byte allocation
01-06 06:21:06.665 3196-3198/soft.ini I/dalvikvm-heap: Clamp target GC heap from 64.156MB to 64.000MB
01-06 06:21:06.665 3196-3198/soft.ini D/dalvikvm: GC_CONCURRENT freed 0K, 3% free 61557K/63111K, paused 13ms+14ms, total 53ms
01-06 06:21:11.510 3196-3196/soft.ini D/AndroidRuntime: Shutting down VM
01-06 06:21:11.510 3196-3196/soft.ini W/dalvikvm: threadid=1: thread exiting with uncaught exception (group=0x419252a0)
这里开始红字
01-06 06:21:11.940 3196-3196/soft.ini E/AndroidRuntime: FATAL EXCEPTION: main
01-06 06:21:11.940 3196-3196/soft.ini E/AndroidRuntime: java.lang.RuntimeException: Unable to start activity ComponentInfo{soft.ini/soft.ini.ui.content}: java.lang.ClassCastException: soft.ini.ui.content@4235a0e8 must implement OnFragmentInteractionListener
01-06 06:21:11.940 3196-3196/soft.ini E/AndroidRuntime: at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2092)
01-06 06:21:11.940 3196-3196/soft.ini E/AndroidRuntime: at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2117)
01-06 06:21:11.940 3196-3196/soft.ini E/AndroidRuntime: at android.app.ActivityThread.access0(ActivityThread.java:134)
01-06 06:21:11.940 3196-3196/soft.ini E/AndroidRuntime: at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1218)
01-06 06:21:11.940 3196-3196/soft.ini E/AndroidRuntime: at android.os.Handler.dispatchMessage(Handler.java:99)
01-06 06:21:11.940 3196-3196/soft.ini E/AndroidRuntime: at android.os.Looper.loop(Looper.java:137)
01-06 06:21:11.940 3196-3196/soft.ini E/AndroidRuntime: at android.app.ActivityThread.main(ActivityThread.java:4867)
01-06 06:21:11.940 3196-3196/soft.ini E/AndroidRuntime: at java.lang.reflect.Method.invokeNative(Native Method)
01-06 06:21:11.940 3196-3196/soft.ini E/AndroidRuntime: at java.lang.reflect.Method.invoke(Method.java:511)
01-06 06:21:11.940 3196-3196/soft.ini E/AndroidRuntime: at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1007)
01-06 06:21:11.940 3196-3196/soft.ini E/AndroidRuntime: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:774)
01-06 06:21:11.940 3196-3196/soft.ini E/AndroidRuntime: at dalvik.system.NativeStart.main(Native Method)
01-06 06:21:11.940 3196-3196/soft.ini E/AndroidRuntime: Caused by: java.lang.ClassCastException: soft.ini.ui.content@4235a0e8 must implement OnFragmentInteractionListener
01-06 06:21:11.940 3196-3196/soft.ini E/AndroidRuntime: at soft.ini.ui.principalFragment.onAttach(principalFragment.java:83)
01-06 06:21:11.940 3196-3196/soft.ini E/AndroidRuntime: at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:787)
01-06 06:21:11.940 3196-3196/soft.ini E/AndroidRuntime: at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1035)
01-06 06:21:11.940 3196-3196/soft.ini E/AndroidRuntime: at android.app.BackStackRecord.run(BackStackRecord.java:635)
01-06 06:21:11.940 3196-3196/soft.ini E/AndroidRuntime: at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1399)
01-06 06:21:11.940 3196-3196/soft.ini E/AndroidRuntime: at android.app.Activity.performStart(Activity.java:5056)
01-06 06:21:11.940 3196-3196/soft.ini E/AndroidRuntime: at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2065)
01-06 06:21:11.940 3196-3196/soft.ini E/AndroidRuntime: at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2117)
01-06 06:21:11.940 3196-3196/soft.ini E/AndroidRuntime: at android.app.ActivityThread.access0(ActivityThread.java:134)
01-06 06:21:11.940 3196-3196/soft.ini E/AndroidRuntime: at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1218)
01-06 06:21:11.940 3196-3196/soft.ini E/AndroidRuntime: at android.os.Handler.dispatchMessage(Handler.java:99)
01-06 06:21:11.940 3196-3196/soft.ini E/AndroidRuntime: at android.os.Looper.loop(Looper.java:137)
01-06 06:21:11.940 3196-3196/soft.ini E/AndroidRuntime: at android.app.ActivityThread.main(ActivityThread.java:4867)
01-06 06:21:11.940 3196-3196/soft.ini E/AndroidRuntime: at java.lang.reflect.Method.invokeNative(Native Method)
01-06 06:21:11.940 3196-3196/soft.ini E/AndroidRuntime: at java.lang.reflect.Method.invoke(Method.java:511)
01-06 06:21:11.940 3196-3196/soft.ini E/AndroidRuntime: at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1007)
01-06 06:21:11.940 3196-3196/soft.ini E/AndroidRuntime: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:774)
01-06 06:21:11.940 3196-3196/soft.ini E/AndroidRuntime: at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.ClassCastException: soft.ini.ui.content@4235a0e8
must implement OnFragmentInteractionListener
您的主机 Activity
必须实现 principalFragment 的 OnFragmentInteractionListener
:
public class YourActivity implements principalFragment.OnFragmentInteractionListener {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
FragmentManager fragmentManager = getFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
principalFragment hello = principalFragment.newInstance();
fragmentTransaction.replace(R.id.fragment_container, hello, hello.TAG);
fragmentTransaction.commit();
}
...
// Implement the listener's methods
// @Override
}
并实现其方法。另外,使用 FragmentTransaction 的 replace
方法,而不是 add()
.
在我的片段中 Activity 我这样做了:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
FragmentManager fragmentManager = getFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
principalFragment hello = principalFragment.newInstance();
fragmentTransaction.add(R.id.fragment_container, hello, hello.TAG);
fragmentTransaction.commit();
}
这是我要打开的片段
<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="plenumsoft.iniciativayucatan.ui.principal">
<RelativeLayout
android:layout_width="fill_parent"
android:layout_height="135dp"
android:background="@color/colorTerracota"
android:padding="15dp"
android:layout_centerVertical="true"
android:layout_centerHorizontal="true"
android:layout_gravity="center">
<Button
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/statetexas"
android:id="@+id/btnTexas"
android:width="100dp"
android:layout_alignParentBottom="true"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true" />
<Button
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/stateyucatan"
android:id="@+id/btnYucatan"
android:width="100dp"
android:layout_alignParentTop="true"
android:layout_alignLeft="@+id/btnTexas"
android:layout_alignStart="@+id/btnTexas" />
</RelativeLayout>
</FrameLayout>
如果我创建一个新片段,我会得到相同的结果(默认情况下 android studio 使用 "hello blank fragment")
如果我将 <fragment>
添加到 activity
是logcat
01-06 06:21:00.990 3196-3196/? D/dalvikvm: Late-enabling CheckJNI
01-06 06:21:01.290 3196-3196/soft.ini W/ActivityThread: Application soft.ini is waiting for the debugger on port 8100...
01-06 06:21:01.310 3196-3196/soft.ini I/System.out: Sending WAIT chunk
01-06 06:21:01.450 3196-3203/soft.ini I/dalvikvm: Debugger is active
01-06 06:21:01.510 3196-3196/soft.ini I/System.out: Debugger has connected
01-06 06:21:01.510 3196-3196/soft.ini I/System.out: waiting for debugger to settle...
01-06 06:21:01.711 3196-3196/soft.ini I/System.out: waiting for debugger to settle...
01-06 06:21:01.911 3196-3196/soft.ini I/System.out: waiting for debugger to settle...
01-06 06:21:02.111 3196-3196/soft.ini I/System.out: waiting for debugger to settle...
01-06 06:21:02.311 3196-3196/soft.ini I/System.out: waiting for debugger to settle...
01-06 06:21:02.511 3196-3196/soft.ini I/System.out: waiting for debugger to settle...
01-06 06:21:02.711 3196-3196/soft.ini I/System.out: waiting for debugger to settle...
01-06 06:21:02.912 3196-3196/soft.ini I/System.out: waiting for debugger to settle...
01-06 06:21:03.112 3196-3196/soft.ini I/System.out: debugger has settled (1428)
01-06 06:21:03.602 3196-3196/soft.ini D/roboguice.RoboGuice: Using annotation database(s).
01-06 06:21:03.612 3196-3196/soft.ini D/roboguice.RoboGuice: Using annotation database(s) : [, roboguice]
01-06 06:21:03.632 3196-3196/soft.ini D/roboguice.RoboGuice: Time spent loading annotation databases : 17
01-06 06:21:03.783 3196-3198/soft.ini D/dalvikvm: GC_CONCURRENT freed 302K, 13% free 9449K/10823K, paused 16ms+13ms, total 74ms
01-06 06:21:04.623 3196-3198/soft.ini D/dalvikvm: GC_CONCURRENT freed 357K, 14% free 9539K/11015K, paused 19ms+23ms, total 113ms
01-06 06:21:05.895 3196-3196/soft.ini D/dalvikvm: GC_FOR_ALLOC freed 52K, 14% free 9557K/11015K, paused 57ms, total 63ms
01-06 06:21:06.195 3196-3196/soft.ini I/dalvikvm-heap: Grow heap (frag case) to 26.000MB for 16384016-byte allocation
01-06 06:21:06.345 3196-3198/soft.ini D/dalvikvm: GC_CONCURRENT freed <1K, 6% free 25557K/27079K, paused 12ms+6ms, total 146ms
01-06 06:21:06.345 3196-3203/soft.ini D/dalvikvm: WAIT_FOR_CONCURRENT_GC blocked 50ms
01-06 06:21:06.445 3196-3196/soft.ini D/dalvikvm: GC_FOR_ALLOC freed <1K, 6% free 25557K/27079K, paused 20ms, total 20ms
01-06 06:21:06.605 3196-3196/soft.ini I/dalvikvm-heap: Grow heap (frag case) to 61.156MB for 36864016-byte allocation
01-06 06:21:06.665 3196-3198/soft.ini I/dalvikvm-heap: Clamp target GC heap from 64.156MB to 64.000MB
01-06 06:21:06.665 3196-3198/soft.ini D/dalvikvm: GC_CONCURRENT freed 0K, 3% free 61557K/63111K, paused 13ms+14ms, total 53ms
01-06 06:21:11.510 3196-3196/soft.ini D/AndroidRuntime: Shutting down VM
01-06 06:21:11.510 3196-3196/soft.ini W/dalvikvm: threadid=1: thread exiting with uncaught exception (group=0x419252a0)
这里开始红字
01-06 06:21:11.940 3196-3196/soft.ini E/AndroidRuntime: FATAL EXCEPTION: main
01-06 06:21:11.940 3196-3196/soft.ini E/AndroidRuntime: java.lang.RuntimeException: Unable to start activity ComponentInfo{soft.ini/soft.ini.ui.content}: java.lang.ClassCastException: soft.ini.ui.content@4235a0e8 must implement OnFragmentInteractionListener
01-06 06:21:11.940 3196-3196/soft.ini E/AndroidRuntime: at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2092)
01-06 06:21:11.940 3196-3196/soft.ini E/AndroidRuntime: at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2117)
01-06 06:21:11.940 3196-3196/soft.ini E/AndroidRuntime: at android.app.ActivityThread.access0(ActivityThread.java:134)
01-06 06:21:11.940 3196-3196/soft.ini E/AndroidRuntime: at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1218)
01-06 06:21:11.940 3196-3196/soft.ini E/AndroidRuntime: at android.os.Handler.dispatchMessage(Handler.java:99)
01-06 06:21:11.940 3196-3196/soft.ini E/AndroidRuntime: at android.os.Looper.loop(Looper.java:137)
01-06 06:21:11.940 3196-3196/soft.ini E/AndroidRuntime: at android.app.ActivityThread.main(ActivityThread.java:4867)
01-06 06:21:11.940 3196-3196/soft.ini E/AndroidRuntime: at java.lang.reflect.Method.invokeNative(Native Method)
01-06 06:21:11.940 3196-3196/soft.ini E/AndroidRuntime: at java.lang.reflect.Method.invoke(Method.java:511)
01-06 06:21:11.940 3196-3196/soft.ini E/AndroidRuntime: at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1007)
01-06 06:21:11.940 3196-3196/soft.ini E/AndroidRuntime: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:774)
01-06 06:21:11.940 3196-3196/soft.ini E/AndroidRuntime: at dalvik.system.NativeStart.main(Native Method)
01-06 06:21:11.940 3196-3196/soft.ini E/AndroidRuntime: Caused by: java.lang.ClassCastException: soft.ini.ui.content@4235a0e8 must implement OnFragmentInteractionListener
01-06 06:21:11.940 3196-3196/soft.ini E/AndroidRuntime: at soft.ini.ui.principalFragment.onAttach(principalFragment.java:83)
01-06 06:21:11.940 3196-3196/soft.ini E/AndroidRuntime: at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:787)
01-06 06:21:11.940 3196-3196/soft.ini E/AndroidRuntime: at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1035)
01-06 06:21:11.940 3196-3196/soft.ini E/AndroidRuntime: at android.app.BackStackRecord.run(BackStackRecord.java:635)
01-06 06:21:11.940 3196-3196/soft.ini E/AndroidRuntime: at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1399)
01-06 06:21:11.940 3196-3196/soft.ini E/AndroidRuntime: at android.app.Activity.performStart(Activity.java:5056)
01-06 06:21:11.940 3196-3196/soft.ini E/AndroidRuntime: at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2065)
01-06 06:21:11.940 3196-3196/soft.ini E/AndroidRuntime: at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2117)
01-06 06:21:11.940 3196-3196/soft.ini E/AndroidRuntime: at android.app.ActivityThread.access0(ActivityThread.java:134)
01-06 06:21:11.940 3196-3196/soft.ini E/AndroidRuntime: at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1218)
01-06 06:21:11.940 3196-3196/soft.ini E/AndroidRuntime: at android.os.Handler.dispatchMessage(Handler.java:99)
01-06 06:21:11.940 3196-3196/soft.ini E/AndroidRuntime: at android.os.Looper.loop(Looper.java:137)
01-06 06:21:11.940 3196-3196/soft.ini E/AndroidRuntime: at android.app.ActivityThread.main(ActivityThread.java:4867)
01-06 06:21:11.940 3196-3196/soft.ini E/AndroidRuntime: at java.lang.reflect.Method.invokeNative(Native Method)
01-06 06:21:11.940 3196-3196/soft.ini E/AndroidRuntime: at java.lang.reflect.Method.invoke(Method.java:511)
01-06 06:21:11.940 3196-3196/soft.ini E/AndroidRuntime: at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1007)
01-06 06:21:11.940 3196-3196/soft.ini E/AndroidRuntime: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:774)
01-06 06:21:11.940 3196-3196/soft.ini E/AndroidRuntime: at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.ClassCastException: soft.ini.ui.content@4235a0e8 must implement OnFragmentInteractionListener
您的主机 Activity
必须实现 principalFragment 的 OnFragmentInteractionListener
:
public class YourActivity implements principalFragment.OnFragmentInteractionListener {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
FragmentManager fragmentManager = getFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
principalFragment hello = principalFragment.newInstance();
fragmentTransaction.replace(R.id.fragment_container, hello, hello.TAG);
fragmentTransaction.commit();
}
...
// Implement the listener's methods
// @Override
}
并实现其方法。另外,使用 FragmentTransaction 的 replace
方法,而不是 add()
.