当屏幕方向发生变化时,我遇到了关于对话碎片的令人沮丧的问题。当我在处理程序中使用它时,成员对象(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中已经阅读了相当多的帖子,但仍然无法让它工作......非常感谢任何帮助!
答案 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不需要知道主机的特定活动。