很抱歉,如果之前有人询问,但我找不到具体案例的答案。也很抱歉,我是新人,有点愚蠢。
问题: 我正在从片段中显示一个对话框,并在构造函数方法中传递上下文,因为我需要在对话框中输入上下文来注册广播记录器等。
DialogFragment fragmentDialog = MyDialog.myConstructor(getActivity());
fragmentDialog.show(getFragmentManager(), "dialog");
然后在MyDialog类中,我将上下文存储在实例变量中。 旋转设备时出现问题,当我尝试在对话框中再次使用上下文时,我得到一个nullPointerException。
这可以通过一些简单的方法解决吗?
答案 0 :(得分:2)
如果旋转设备,活动将被销毁并重新创建。因此,传递给Fragment的Context在被销毁的Activity上指向。
您可以在片段中使用setRetainInstance(true)。通过这种方式,您的片段将在重新创建活动后继续存在。
要解决NPE,必须将Context传递给Fragment,如果重新创建了Activity。然后Context属于新的Activity。
事实上,如果没有这个更新,那么指向Activity的每一行代码(如getActivity()或getFragmentManager()都将在NPE中引领。
答案 1 :(得分:1)
您将获得Null Pointer Exception,因为在旋转屏幕时会破坏并重新创建活动。
下面的SO帖子提供了更多信息...
答案 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()...函数调用之前的
答案 3 :(得分:0)
根据您在初始化时所做的事情,您可以考虑创建一个扩展Application的新类,并将初始化代码移动到该类中的重写onCreate方法。
public class MyApplicationClass extends Application {
@Override
public void onCreate() {
super.onCreate();
// TODO Put your application initialization code here.
}
}
你并不愚蠢,甚至专家也不时需要帮助。