方向更改后的And​​r​​oid DialogFragment消失方向、And、DialogFragment、oid

由网友(凉心凉意凉少年)分享简介:我有它实现了两个并排的(有点像Gmail的)一个FragmentActivity支持V4级碎片和一个按钮,可以打开一个DialogFragment。 这一切的伟大工程,除非我有一个方向变化。当我有一个方向变化的片段的状态不会被保存。和存在的主要问题是,如果我有一个的FragmentDialog开放的,它只是消失了。 我...

我有它实现了两个并排的(有点像Gmail的)一个FragmentActivity支持V4级碎片和一个按钮,可以打开一个DialogFragment。

这一切的伟大工程,除非我有一个方向变化。当我有一个方向变化的片段的状态不会被保存。

和存在的主要问题是,如果我有一个的FragmentDialog开放的,它只是消失了。

我已经设置 setRetainInstance(真); 中的所有片段,但它并没有帮助

在我的清单我包括机器人:configChanges =定向,但仍于事无补

下面是我的code样品,感谢大家的帮助。

 公共类AddMasterDialog扩展DialogFragment {

    私人诠释mTitle;
    私人诠释mPrompt;
    私人OnClickListener onSaveListener;
    私人OnClickListener onCancelListener;

    公共AddMasterDialog的newInstance(INT称号,INT提示){
        AddMasterDialog simpleDialog =新AddMasterDialog(标题,提示);
        返回simpleDialog;
    }

    公共AddMasterDialog(){
        //需要DialogFragment空的构造
    }
    公共AddMasterDialog(INT称号,INT提示){
        //需要DialogFragment空的构造
        mTitle =称号;
        mPrompt =提示;
    }
    公共无效setSaveButton(OnClickListener保存){
        onSaveListener =保存;
    }
    公共无效setCancelButton(OnClickListener取消){
        onCancelListener =取消;
    }
    @覆盖
    公共无效的onCreate(包savedInstanceState){
        super.onCreate(savedInstanceState);
        setRetainInstance(真正的);
    }

    @覆盖
    公共查看onCreateView(LayoutInflater充气,容器的ViewGroup,
            捆绑savedInstanceState){

        //如果(savedInstanceState == NULL){
            查看查看= inflater.inflate(R.layout.add_new_simple,集装箱);
            。getDialog()的setTitle(mTitle);
            ((TextView中)view.findViewById(R.id.add_simple_new_value_prompt))的setText(mPrompt)。

            按钮saveButton =(按钮)view.findViewById(R.id.add_simple_save_button);
            saveButton.setOnClickListener(onSaveListener);

            //取消按钮
            按钮cancelButton =(按钮)view.findViewById(R.id.add_simple_cancel_button);
            cancelButton.setOnClickListener(onCancelListener);
            返回查看;
        //}
    }
}
 

和我的主要活动:

 私人无效initiateAddMasterPopupWindow(){
        尝试 {
            addMasterDialog =新AddMasterDialog(R.string.add_new_master_dialog_title,R.string.add_master_new_value_prompt);
            addMasterDialog.setSaveButton(saveNewMasterClickListener);
            addMasterDialog.setCancelButton(cancelNewMasterClickListener);
            FragmentManager FM = getSupportFragmentManager();
            addMasterDialog.show(FM,ADD_NEW_MASTER);

        }赶上(例外五){
            e.printStackTrace();
        }
    }
 

解决方案

好了,这个问题似乎是与 DialogFragment 兼容库。

该问题已在描述了这个的帖子。

的片段过时的解除消息保留在消息队列中。它已经排队通过 DialogFragment.onDestroyView()解聘老对话和创造之后被激活时,新的对话框。

有一个快速的(也可能是脏)的解决方法是覆盖 onDestroyView()并清除调用之前解雇监听 super.onDestroyView()

添加以下code我DialogFragment解决的问题:

  @覆盖
 公共无效onDestroyView(){
     如果(getDialog()=空&安培;!&安培; getRetainInstance()){
         getDialog()setDismissMessage(空)。
     }
     super.onDestroyView();
 }
 

I have a FragmentActivity support v4 class which implements two side by side (kind of like gmail) fragments and a button which can bring up a DialogFragment.

This all works great unless I have an orientation change. When I have an orientation change the states of the Fragments are not saved.

And the main problem is if I have a the FragmentDialog open, it simply disappears.

I have set setRetainInstance(true); in all fragments but it did not help.

In my manifest I included android:configChanges="orientation" but is still does not help.

Here are my code samples, thank you for the help.

public class AddMasterDialog extends DialogFragment {

    private int mTitle;
    private int mPrompt;
    private OnClickListener onSaveListener;
    private OnClickListener onCancelListener;

    public AddMasterDialog newInstance(int title, int prompt) {
        AddMasterDialog simpleDialog = new AddMasterDialog(title, prompt);
        return simpleDialog;
    }

    public AddMasterDialog() {
        // Empty constructor required for DialogFragment
    }
    public AddMasterDialog(int title, int prompt) {
        // Empty constructor required for DialogFragment
        mTitle = title;
        mPrompt = prompt;
    }
    public void setSaveButton(OnClickListener save){
        onSaveListener = save;
    }
    public void setCancelButton(OnClickListener cancel){
        onCancelListener = cancel;
    }
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setRetainInstance(true);
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {

        //if(savedInstanceState == null){
            View view = inflater.inflate(R.layout.add_new_simple, container);
            getDialog().setTitle(mTitle);
            ((TextView) view.findViewById(R.id.add_simple_new_value_prompt)).setText(mPrompt);

            Button saveButton = (Button) view.findViewById(R.id.add_simple_save_button);
            saveButton.setOnClickListener(onSaveListener);

            //Cancel Button
            Button cancelButton = (Button) view.findViewById(R.id.add_simple_cancel_button);
            cancelButton.setOnClickListener(onCancelListener);
            return view;
        //}
    }
}

and in my Main activity:

private void initiateAddMasterPopupWindow() {
        try {
            addMasterDialog = new AddMasterDialog(R.string.add_new_master_dialog_title, R.string.add_master_new_value_prompt);
            addMasterDialog.setSaveButton(saveNewMasterClickListener);
            addMasterDialog.setCancelButton(cancelNewMasterClickListener);
            FragmentManager fm = getSupportFragmentManager();
            addMasterDialog.show(fm, ADD_NEW_MASTER);

        } catch (Exception e) {
            e.printStackTrace();
        }
    }

解决方案

Okay, so the issue seems to be with the DialogFragment compatibility library.

The issue was described in this post.

"An obsolete DISMISS message for the fragment is retained in the message queue. It's been queued by DialogFragment.onDestroyView() when dismissing the old dialog and gets reactivated after creating the new dialog.

A quick (and possibly dirty) workaround is to override onDestroyView() and clear the dismiss listener before calling super.onDestroyView()"

Adding the following code to my DialogFragment solved the issue:

 @Override
 public void onDestroyView() {
     if (getDialog() != null && getRetainInstance()) {
         getDialog().setDismissMessage(null);
     }
     super.onDestroyView();
 }

阅读全文

相关推荐

最新文章