0

我是 Android 编程的初学者...我正在使用以下代码将片段添加到布局中

                Fragment f=new Jobcat();
    FragmentManager fm=getSupportFragmentManager();
    FragmentTransaction ft =fm.beginTransaction();
    ft.add(R.id.jobcategoryfragment, f,"A");
    ft.commit();
                ft.add(R.id.jobcategoryfragment, f,"C");
    ft.commit();
    ft.add(R.id.jobcategoryfragment, f,"B");
    ft.commit();

并且我正在使用以下代码删除片段..

Fragment f = getSupportFragmentManager().findFragmentByTag("B");
   FragmentTransaction ft=getSupportFragmentManager().beginTransaction();
   ft.remove(f);
   ft.commit();

如果屏幕方向没有改变,它运行良好......如果我改变了屏幕方向,或者即使我在收到运行时错误后将方向恢复到原始状态

04-02 17:02:23.051: W/dalvikvm(8937): threadid=1: 线程退出未捕获异常 (group=0x41082930) 04-02 17:02:23.051: E/AndroidRuntime(8937): 致命异常: main 04-02 17:02:23.051: E/AndroidRuntime(8937): java.lang.NullPointerException 04-02 17:02:23.051: E/AndroidRuntime(8937): 在 android.support.v4.app.BackStackRecord.run( BackStackRecord.java:651) 04-02 17:02:23.051: E/AndroidRuntime(8937): 在 android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1444) 04-02 17:02:23.051: E/AndroidRuntime(8937): 在 android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:429) 04-02 17:02:23.051: E/AndroidRuntime(8937): 在 android.os.Handler。 handleCallback(Handler.java:725) 04-02 17:02:23.051: E/AndroidRuntime(8937): 在 android.os.Handler.dispatchMessage(Handler.java:92) 04-02 17:02:23.051: E/AndroidRuntime(8937): 在 android.os.Looper.loop(Looper.java:137) 04-02 17:02:23.051: E/AndroidRuntime(8937): 在android.app.ActivityThread.main(ActivityThread.java:5041) 04-02 17:02:23.051: E/AndroidRuntime(8937): 在 java.lang.reflect.Method.invokeNative(Native Method) 04-02 17:02 :23.051: E/AndroidRuntime(8937): at java.lang.reflect.Method.invoke(Method.java:511) 04-02 17:02:23.051: E/AndroidRuntime(8937): at com.android.internal。 os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793) 04-02 17:02:23.051: E/AndroidRuntime(8937): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560) 04 -02 17:02:23.051:E/AndroidRuntime(8937):在 dalvik.system.NativeStart.main(本机方法)02:23.051: E/AndroidRuntime(8937): 在 android.app.ActivityThread.main(ActivityThread.java:5041) 04-02 17:02:23.051: E/AndroidRuntime(8937): 在 java.lang.reflect.Method .invokeNative(Native Method) 04-02 17:02:23.051: E/AndroidRuntime(8937): at java.lang.reflect.Method.invoke(Method.java:511) 04-02 17:02:23.051: E/ AndroidRuntime(8937): 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793) 04-02 17:02:23.051: E/AndroidRuntime(8937): 在 com.android.internal.os .ZygoteInit.main(ZygoteInit.java:560) 04-02 17:02:23.051: E/AndroidRuntime(8937): at dalvik.system.NativeStart.main(Native Method)02:23.051: E/AndroidRuntime(8937): 在 android.app.ActivityThread.main(ActivityThread.java:5041) 04-02 17:02:23.051: E/AndroidRuntime(8937): 在 java.lang.reflect.Method .invokeNative(Native Method) 04-02 17:02:23.051: E/AndroidRuntime(8937): at java.lang.reflect.Method.invoke(Method.java:511) 04-02 17:02:23.051: E/ AndroidRuntime(8937): 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793) 04-02 17:02:23.051: E/AndroidRuntime(8937): 在 com.android.internal.os .ZygoteInit.main(ZygoteInit.java:560) 04-02 17:02:23.051: E/AndroidRuntime(8937): at dalvik.system.NativeStart.main(Native Method)invokeNative(本机方法)04-02 17:02:23.051:E/AndroidRuntime(8937):在 java.lang.reflect.Method.invoke(Method.java:511)04-02 17:02:23.051:E/AndroidRuntime (8937): 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793) 04-02 17:02:23.051: E/AndroidRuntime(8937): 在 com.android.internal.os。 ZygoteInit.main(ZygoteInit.java:560) 04-02 17:02:23.051: E/AndroidRuntime(8937): at dalvik.system.NativeStart.main(Native Method)invokeNative(本机方法)04-02 17:02:23.051:E/AndroidRuntime(8937):在 java.lang.reflect.Method.invoke(Method.java:511)04-02 17:02:23.051:E/AndroidRuntime (8937): 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793) 04-02 17:02:23.051: E/AndroidRuntime(8937): 在 com.android.internal.os。 ZygoteInit.main(ZygoteInit.java:560) 04-02 17:02:23.051: E/AndroidRuntime(8937): at dalvik.system.NativeStart.main(Native Method)E/AndroidRuntime(8937): 在 dalvik.system.NativeStart.main(Native Method)E/AndroidRuntime(8937): 在 dalvik.system.NativeStart.main(Native Method)

谁能帮我找到解决这个问题的方法...

谢谢

4

2 回答 2

0

NullPointerException 发生是因为在配置更改后片段可能不再添加到您的活动中。如果在配置更改期间未保留 Fragment,则会发生这种情况。

你有两个选择:

  1. 在你的 Jobcat-Fragment 添加 setRetained(true); 到您的 onCreate() 方法。有了这个,您的片段将在方向更改中幸存下来,并使用与以前相同的 TAG 被读取到您的活动中。不建议对具有 GUI 的片段执行此操作以避免泄漏,但有时我发现没有其他方便的方法可以实现此目的。

  2. 检查是否

    片段 f = getSupportFragmentManager().findFragmentByTag("B") -> null

如果是这样,则无需从您的活动中删除该片段,因为它已经不存在了。

于 2013-10-31T09:59:34.873 回答
-1

请加

android:configChanges="orientation|keyboardHidden|screenSize"

在描述当前活动的 androidmanifest.xml 中...

于 2013-04-02T13:36:26.313 回答