【问题标题】:Android : Replacing a fragment inside an Activity's onPause() method gives NullPointerExceptionAndroid:替换 Activity 的 onPause() 方法中的片段会产生 NullPointerException
【发布时间】:2013-06-16 19:13:16
【问题描述】:

我正在尝试在 android 中学习片段,并尝试在 Activity 暂停时将片段替换为 Activity 的 onPause() 方法中的另一个片段。

我的 onPause 方法代码是:-

public void onPause(){
    super.onPause();
    System.out.println("ActivityA-onPause()-1");
    ArticleListFragment temp=(ArticleListFragment) getFragmentManager().findFragmentById(R.id.article_list_fragment);
    System.out.println("ActivityA-onPause()-2");
    if(!temp.isAdded()){    //problem
        System.out.println("ActivityA-onPause()-3");
        fragmentTransaction.replace(R.id.activity_a, articleReaderFragment, new String("readerFragment"));
        System.out.println("ActivityA-onPause()-4");
    }
    System.out.println("ActivityA-onPause()-5");
}

当我在设备上执行应用程序时,onPause() 会执行,但只打印到“Activity-onPause()-2”,但不打印“Activity-onPause()-3”。

我得到错误日志:-

06-13 00:25:10.946: I/System.out(17974): ActivityA-onPause()-1
06-13 00:25:10.946: I/System.out(17974): ActivityA-onPause()-2
06-13 00:25:10.946: D/AndroidRuntime(17974): Shutting down VM
06-13 00:25:10.946: W/dalvikvm(17974): threadid=1: thread exiting with uncaught exception (group=0xb4e04908)
06-13 00:25:10.961: E/AndroidRuntime(17974): FATAL EXCEPTION: main
06-13 00:25:10.961: E/AndroidRuntime(17974): java.lang.RuntimeException: Unable to pause activity {com.pravesh.fragments/com.pravesh.fragments.ActivityA}: java.lang.NullPointerException
06-13 00:25:10.961: E/AndroidRuntime(17974):    at android.app.ActivityThread.performPauseActivity(ActivityThread.java:3016)
06-13 00:25:10.961: E/AndroidRuntime(17974):    at android.app.ActivityThread.performPauseActivity(ActivityThread.java:2971)
06-13 00:25:10.961: E/AndroidRuntime(17974):    at android.app.ActivityThread.handlePauseActivity(ActivityThread.java:2949)
06-13 00:25:10.961: E/AndroidRuntime(17974):    at android.app.ActivityThread.access$800(ActivityThread.java:141)
06-13 00:25:10.961: E/AndroidRuntime(17974):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1251)
06-13 00:25:10.961: E/AndroidRuntime(17974):    at android.os.Handler.dispatchMessage(Handler.java:99)
06-13 00:25:10.961: E/AndroidRuntime(17974):    at android.os.Looper.loop(Looper.java:137)
06-13 00:25:10.961: E/AndroidRuntime(17974):    at android.app.ActivityThread.main(ActivityThread.java:5039)
06-13 00:25:10.961: E/AndroidRuntime(17974):    at java.lang.reflect.Method.invokeNative(Native Method)
06-13 00:25:10.961: E/AndroidRuntime(17974):    at java.lang.reflect.Method.invoke(Method.java:511)
06-13 00:25:10.961: E/AndroidRuntime(17974):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
06-13 00:25:10.961: E/AndroidRuntime(17974):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
06-13 00:25:10.961: E/AndroidRuntime(17974):    at dalvik.system.NativeStart.main(Native Method)
06-13 00:25:10.961: E/AndroidRuntime(17974): Caused by: java.lang.NullPointerException
06-13 00:25:10.961: E/AndroidRuntime(17974):    at com.pravesh.fragments.ActivityA.onPause(ActivityA.java:37)
06-13 00:25:10.961: E/AndroidRuntime(17974):    at android.app.Activity.performPause(Activity.java:5206)
06-13 00:25:10.961: E/AndroidRuntime(17974):    at android.app.Instrumentation.callActivityOnPause(Instrumentation.java:1226)
06-13 00:25:10.961: E/AndroidRuntime(17974):    at android.app.ActivityThread.performPauseActivity(ActivityThread.java:3002)
06-13 00:25:10.961: E/AndroidRuntime(17974):    ... 12 more

我能理解的是它给出了一个空指针异常,但我不知道为什么。

【问题讨论】:

  • 可能你应该检查一下 temp 是否为空
  • fragmentTransaction 可能为空。找到ActivityA.java 的第37 行,因为您的null 对象就在那里。
  • 是的,我也在想可能是 temp 为空。我在临时声明后插入了Object obj=temp; if(obj.equals(null)){ System.out.println("null temp"); },但它也没有打印“null temp”。
  • 如果 temp 为 null 则调用 equals 也会导致 NPE。

标签: android android-activity fragment


【解决方案1】:

在替换您的片段并执行所有其他操作后尝试调用super.onPause

【讨论】:

  • 在 onPause() 结束时尝试了 super.onPause() 但同样的错误,没有什么不同。
  • 只要我认为我在“if(!temp.isAdded())”中出现错误,因为我无法打印“ActivityA-onPause()-3”。
  • Fragment id 是正确的,就像我从 onPause() 内部删除代码一样,它运行良好。
  • 看起来您的 tem var 为空。您从 FragmentManager 中一无所获,这只有在 id 不正确或根本没有添加此类 id 的片段时才有可能。
  • 是的,你说的很对。我使用 findViewByTag() 而不是 findViewById() 来声明 temp,效果很好。不知道为什么 findViewById() 会出错,因为我可以看到 gen->R->id 中提供的相同 ID。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多