Android:旋转时对话框中出现NullPointerException

时间:2013-07-25 19:34:55

标签: android rotation nullpointerexception

很抱歉,如果之前有人询问,但我找不到具体案例的答案。也很抱歉,我是新人,有点愚蠢。

问题: 我正在从片段中显示一个对话框,并在构造函数方法中传递上下文,因为我需要在对话框中输入上下文来注册广播记录器等。

DialogFragment fragmentDialog = MyDialog.myConstructor(getActivity());
fragmentDialog.show(getFragmentManager(), "dialog");

然后在MyDialog类中,我将上下文存储在实例变量中。 旋转设备时出现问题,当我尝试在对话框中再次使用上下文时,我得到一个nullPointerException。

这可以通过一些简单的方法解决吗?

4 个答案:

答案 0 :(得分:2)

如果旋转设备,活动将被销毁并重新创建。因此,传递给Fragment的Context在被销毁的Activity上指向。

您可以在片段中使用setRetainInstance(true)。通过这种方式,您的片段将在重新创建活动后继续存在。

要解决NPE,必须将Context传递给Fragment,如果重新创建了Activity。然后Context属于新的Activity。

事实上,如果没有这个更新,那么指向Activity的每一行代码(如getActivity()或getFragmentManager()都将在NPE中引领。

答案 1 :(得分:1)

您将获得Null Pointer Exception,因为在旋转屏幕时会破坏并重新创建活动。

下面的SO帖子提供了更多信息...

https://stackoverflow.com/a/1673374/

答案 2 :(得分:1)

如果您旋转FragmentActivity,请注意事件的顺序,因为这也可能是NullPointerExceptions的来源。

这未记录: 第一次创建FragmentActivity时,

public class MyActivity extends FragmentActivity implements
                           MyFragment.OnFragmentInteractionListener {

    private int var1;
    private int var2;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
         //before
         var1 = 3;       
         super.onCreate(Bundle savedInstanceState) 
         //after
         var2 = 5;
    }

    //Interface Methods
    public int getVar1() { return var1; }
    public int getVar2() { return var2; }
}

在附加和创建片段之前,将运行[before]和[after]代码。所以,如果你在Fragment的onCreate()调用中得到变量,你就得到了两个变量。但是当您旋转设备时,将从超级调用中的savedInstanceState重新创建活动。现在,重新附加片段并在此调用中重新创建!这意味着,这次在[after]代码之前调用Listener Interface的方法。因此,如果您将活动的上下文传递给片段并通过接口获取信息,如下所示:https://developer.android.com/training/basics/fragments/communicating.html

你得到一个var2的NullPointerException,因为接口方法是从片段onCreate()onAttach()...函数调用之前的代码中的[after]代码调用的)被执行!因此,请注意在超级调用之前设置InterfaceFunction正在访问的信息。

答案 3 :(得分:0)

根据您在初始化时所做的事情,您可以考虑创建一个扩展Application的新类,并将初始化代码移动到该类中的重写onCreate方法。

public class MyApplicationClass extends Application {
  @Override
  public void onCreate() {
    super.onCreate();
    // TODO Put your application initialization code here.
  }
}

你并不愚蠢,甚至专家也不时需要帮助。