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

时间:2014-09-20 08:36:18

标签: android screen-orientation android-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日志)。

我怀疑它与活动重新创建有某种关系,因为我在Activity中的onCreate中创建了一个对话框实例...所以在onActivityResult中,对话框的引用不再是显示的对象。但是在这个时候,我还没有验证它,也没有好好保留对话框的实例。

我在StackOverflow中已经阅读了相当多的帖子,但仍然无法让它工作......非常感谢任何帮助!

1 个答案:

答案 0 :(得分:0)

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

所以我必须编写一些不太好看的代码才能使其工作: 在活动中我添加了一个方法

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不需要知道主机的特定活动。