Android 屏幕旋转后,DialogFragment成员变为空
当屏幕方向改变时,我遇到了一个关于dialogfragment的令人沮丧的问题。当我在处理程序中使用TextView的成员对象时,它将变为null,但在屏幕旋转后,它在onCreateView中膨胀并分配 基本上,我在对话框中有一个按钮,让用户从其他活动中选择文件。 之后,选定的文件路径将打印在textview上 因此,我: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 = ....
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就不需要知道主机的具体活动