2

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

问题: 我正在显示片段中的对话框并在构造函数方法中传递上下文,因为我需要在对话框中使用上下文来注册广播接收器等。

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

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

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

4

4 回答 4

2

如果设备旋转,则 Activity 将被销毁并重新创建。因此,您传递给被销毁的 Activity 上的 Fragment 点的上下文。

您可以在片段中使用setRetainInstance(true)。这样,您的 Fragment 将在 Activity 的重新创建过程中幸存下来。

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

事实上,如果没有这个更新,指向 Activity 的每一行代码,如 getActivity() 或 getFragmentManager() 都会导致 NPE。

于 2013-07-25T20:42:52.553 回答
1

您会收到 NullPointerException,因为在旋转屏幕时活动会被销毁并重新创建。

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

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

于 2013-07-25T19:42:01.293 回答
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() 调用中获得了变量,那么您将获得两个变量。但是当您旋转设备时,Activity 会从 super 调用中的 savedInstanceState 重新创建。现在,片段被重新附加并在此调用中重新创建!这意味着,这一次侦听器接口的方法在您的 [after] 代码之前调用。因此,如果您将活动的上下文传递给片段并通过接口获取信息,如下所示: https ://developer.android.com/training/basics/fragments/communicating.html

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

于 2016-10-22T00:23:36.380 回答
0

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

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

而且你也不傻,即使是专家也时不时需要帮助。

于 2013-07-25T20:24:30.340 回答