Android 屏幕旋转后,DialogFragment成员变为空

Android 屏幕旋转后,DialogFragment成员变为空,android,screen-orientation,android-dialogfragment,Android,Screen Orientation,Android Dialogfragment,当屏幕方向改变时,我遇到了一个关于dialogfragment的令人沮丧的问题。当我在处理程序中使用TextView的成员对象时,它将变为null,但在屏幕旋转后,它在onCreateView中膨胀并分配 基本上,我在对话框中有一个按钮,让用户从其他活动中选择文件。 之后,选定的文件路径将打印在textview上 因此,我: mHandler = new Handler(); public View onCreateView(...) { View rootView = ....

当屏幕方向改变时,我遇到了一个关于dialogfragment的令人沮丧的问题。当我在处理程序中使用TextView的成员对象时,它将变为null,但在屏幕旋转后,它在onCreateView中膨胀并分配

基本上,我在对话框中有一个按钮,让用户从其他活动中选择文件。 之后,选定的文件路径将打印在textview上

因此,我:

mHandler = new Handler();

public View onCreateView(...) {
    View rootView = ....
    mPathView = (TextView)rootView.findViewById(...);
    Log.d("test", String.format("%s", mPathView.toString());
    ...
}
我有一个方法,在附加活动的onActivityResult中调用:

public void onFileSelected(...) {
    if(reqeustCode==Activity.RESULT_OK) {
         ...
         mHandler.post(new Runnable() {
             public void run() {
                 Log.d("test", String.format("mPathView==null:%b", mPathView==null));
                 if(mPathView!=null) {
                     mPathView.setText(path);
                 }
             }
         }
         return;
     }
     //Error handling here
 }
如果我查看logcat,我可以看到如下内容:

09-20 16:13:51.264:     test    android.widget.TextView@41cc15e8
09-20 16:13:52.412:     test    android.widget.TextView@41cc15f8 (after rotation)
09-20 16:13:56.129:     test    mPathView==null: true (after file selected)
我在onCreate中尝试了retainInstance,但它没有解决这个问题,还引入了一个新问题:onCreateView中的savedInstanceState始终为null

我还知道,该实例是在屏幕旋转后重新创建的。但我不明白的是,在重新创建之后,mPathView被指定为logcat日志

我怀疑这与活动的重新创建有关,因为我在活动的onCreate中创建了一个对话框实例。。。因此,在onActivityResult中,对话框的引用不再是显示的引用。但是在这个时候,我还没有验证它,也没有一个好主意来保存对话框的实例


我已经在StackOverflow上读了不少帖子,但仍然无法让它工作。。。非常感谢您的帮助

现在我已经证实了我的怀疑,这就是原因

因此,我必须编写一些不好看的代码才能使其正常工作: 在活动中,我添加了一个方法

public void setDialogInstance(FileSelectDialog dialog) {
    mDialog = dialog;
}
在FileSelectDialog中,我重写了onActivityCreated方法

@Override
public void onActivityCreated(Bundle savedInstanceState) {
    super.onActivityCreated(..);
    try {
        MainActivity host = (MainActivity)getActivity();
        host.setDialogInstance(this);
    } catch(ClassCastException e) {}
}
起初,我试图在onAttach方法中调用setDialogInstance方法,但只发现它在活动的onCreate之前

我认为可以引入一个接口,这样DialogFragment就不需要知道主机的具体活动