【问题标题】:DialogFragment's Dialog loses set properties after a conf changeDialogFragment 的 Dialog 在 conf 更改后丢失设置的属性
【发布时间】:2013-06-11 01:04:42
【问题描述】:

我用这段代码按照新的“片段方式”创建了一个进度对话框:

public class DialogUpdateTrackRecords extends DialogFragment {

    public static DialogUpdateTrackRecords newInstance() {
        DialogUpdateTrackRecords frag = new DialogUpdateTrackRecords();
        return frag;
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);    
    }

    @Override
    public ProgressDialog onCreateDialog(Bundle savedInstanceState) {
        this.setCancelable(false);
        ProgressDialog dialog= new ProgressDialog(getActivity());
        dialog.setTitle("Caricamento tragitti");
        dialog.setIndeterminate(true);
        dialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
        dialog.setMessage("Sending something");

        return dialog;
    }
}

我从这样的活动中展示它:

FragmentManager fm= getSupportFragmentManager();
uploadDialogFrament= (DialogFragment) getSupportFragmentManager().findFragmentByTag("sendDialog");
if(uploadDialogFrament!=null)
    uploadDialogFrament.dismiss();
FragmentTransaction ft= fm.beginTransaction();

uploadDialogFrament= DialogUpdateTrackRecords.newInstance();
uploadDialogFrament.show(ft,"sendDialog");
fm.executePendingTransactions();
((ProgressDialog)uploadDialogFrament.getDialog()).setMax(trackRecordSize);
if( trackRecordSize > 1 )
    ((ProgressDialog)uploadDialogFrament.getDialog()).setIndeterminate(false);

如您所见,我获得了对对话框的引用并设置了它(取决于我的需要)。一切都像魅力一样工作,但是..如果我旋转设备,对话框会回到原始状态,而不是保留(在示例中:栏设置回不确定状态)我的新设置。我检查了我是否错误地创建和显示了一个新对话框,但事实并非如此。那么..我怎样才能在活动的娱乐中保持我的变化?

【问题讨论】:

  • 我忘了说我正在使用 SherlockFragmentActivity。我认为它不应该影响我的片段保留但是..谁知道呢?

标签: android android-fragments progressdialog android-dialogfragment


【解决方案1】:

你试过了吗

setRetainInstance(true)

由于 DialogFragment 扩展了基础 Fragment,我很确定它会起作用。

【讨论】:

  • 是的!我在 Fragment 的 onCreate 函数中添加了一个 setRetainInstance(true)。你猜怎么了?如果设置,并且您旋转屏幕,则片段消失(我的意思是:对话框从屏幕上消失。不确定对话框是否仍然存在)。太搞笑了吧?
  • 所以.. 好消息是我发现这个解决了“setretaininstance”部分link。坏消息:即使“setretaininstance”设置为 true,对话框在 onCreateDialog 中创建后也不会保留其新设置。
  • 好吧,然后使用 onSavedInstanceState() 方法,创建一个包,为您拥有的视图(编辑文本等)保存每个值,然后使用 super.onSavedInstanceState(bundle)。然后,在 onCreate 方法中,从包中获取值并将它们放回视图中
  • 我想我在写这个解决方法的同时你在这里发表评论:) 解决方法有效,但这并不是我们可以预期的行为。我认为这是一个 support-v4 错误(我想说什么新闻)
【解决方案2】:

好的.. 这只是一种解决方法,我不建议这样做。尽管有displainer:我真的没有必要的时间来深入研究这个错误的逻辑,我使用了这个简单的解决方法。简而言之:每次我恢复对话框片段时,我都会使用它应该自动拥有的所有设置来更新它。这是一个例子:

public class DialogUpdateTrackRecords extends DialogFragment {
    private boolean indeterminate= true;

    public static DialogUpdateTrackRecords newInstance() {
        DialogUpdateTrackRecords frag = new DialogUpdateTrackRecords();
        return frag;
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setRetainInstance(true);
    }

    @Override
    public void onResume() {
        super.onResume();

        ((ProgressDialog)getDialog()).setIndeterminate(indeterminate);
    }

    @Override
    public ProgressDialog onCreateDialog(Bundle savedInstanceState) {
        this.setCancelable(false);
        ProgressDialog dialog= new ProgressDialog(getActivity());
        dialog.setTitle("Caricamento tragitti");
        dialog.setIndeterminate(true);
        dialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
        dialog.setMessage("Invio delle statistiche completate a ISF Modena in corso");
        return dialog;
    }


    public void setIndeterminate(){
        ((ProgressDialog)getDialog()).setIndeterminate(false);
        indeterminate= false;
    }



    /*
    [italian soh]
    http://stackoverflow.com/questions/12433397/android-dialogfragment-disappears-after-orientation-change
    thanks, google. Thanks.
    [/italian soh]
     */
    @Override
    public void onDestroyView() {
        if (getDialog() != null && getRetainInstance())
            getDialog().setDismissMessage(null);
        super.onDestroyView();
    }

}

无论如何:如果有人发现这种奇怪行为的原因,我会非常乐意正确修复我的代码。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-13
    • 2012-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-05
    • 1970-01-01
    相关资源
    最近更新 更多