屏幕方向改变后,DialogFragment 显然出现,没有任何调用

9

这里是Activity中屏幕方向改变的部分:

protected void onCreate(Bundle savedInstanceState) 
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    et = (EditText) findViewById(R.id.editText1);

    et.setOnLongClickListener(new View.OnLongClickListener() 
    {
        @Override
        public boolean onLongClick(View v) 
        {
            Fragment1 dialogFragment = new Fragment1();
            dialogFragment.show(getFragmentManager(), null);
            dialogFragment.setTextDialog(et.getText().toString());
            return true;                
        }
    });        
}

显然,似乎DialogFragment内部将出现的对话框应该在editText上的onLongClick之后出现。(我知道当屏幕方向改变时,Activity会重新启动,但它不应该像第一次创建时那样正常启动?)
我的问题是:当我至少打开一次对话框并关闭它后,屏幕方向改变后,对话框再次显示在屏幕上,就像我长按了editText一样。
我绝对不知道为什么会这样。
我也附上了对话框片段的结构。
public Dialog onCreateDialog(Bundle savedInstanceState) 
{
    final Dialog dialog = super.onCreateDialog(savedInstanceState);
    dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
    LayoutInflater adbInflater = LayoutInflater.from(getActivity());

    View eulaLayout = adbInflater.inflate(R.layout.dialog_crypt, null);     
    Button btn_OK = (Button) eulaLayout.findViewById(R.id.btnOK);
    dialog.setContentView(eulaLayout);

    final EditText et = (EditText)eulaLayout.findViewById(R.id.editText2);
    et.setText(textDialog);

    if(et.length()>0)
    {
        et.setText(et.getText().toString() +  " ");
    }

    et.setSelection(et.length());

    btn_OK.setOnClickListener(
            new View.OnClickListener() 
            {
                @Override
                public void onClick(View v) 
                {
                    textDialog = et.getText().toString();
                    ((Main)getActivity()).setTextOnEditText(textDialog);
                    dialog.dismiss();
                }
            });
    return dialog;
}

非常感谢您的帮助。

你是先启动活动,什么都不做,旋转设备然后对话框出现,还是先启动活动,点击EditText,旋转设备...? - nikis
你确定你的活动在旋转时被重新启动了吗?你添加了任何可能阻止活动重新启动的代码吗?比如清单中的配置更改? - shaktiman_droid
@Injhb 我认为应用已经重新启动了,但我也尝试在清单文件中添加了android:configChanges="orientation",但结果仍然相同! - Gasta87
@Gasta87 如果你加上configChanges并覆盖方法,那么活动就不会重新启动。这就是我的观点。 - shaktiman_droid
@Injhb 我在gDrive上放了一个视频样本!这是链接:link - Gasta87
显示剩余2条评论
3个回答

8

尝试使用片段管理器从堆栈中删除对话框,而不仅仅是关闭它。

getFragmentManager().beginTransaction().remove(dialogFragment.this).commit();

另外,不要只使用Fragment来创建对话框,应该直接使用DialogFragment。请参阅:DialogFragment

此外,永远不要像这样调用您的活动方法(((Main)getActivity()).setTextOnEditText(textDialog);),除非您的片段是静态内部类。相反,创建一个interface在片段和活动之间进行通信。


1
我可以确认这个方法是有效的,但在我的情况下,我遇到了这个问题,只是因为我忘记在onDismiss方法中包含这一行代码:super.onDismiss(dialog);。也许这会对某些人有所帮助。 - Stan Mots
很好的评论-就我而言,Jabbar的答案会导致java.lang.IllegalStateException:Can not perform this action after onSaveInstanceState异常。 - ban-geoengineering
@ban-geoengineering 这与我的回答无关。你可能在活动未恢复状态下调用了 commit。如果你是在 onActivityResult 中调用它,那么不要在那里这样做,而是确保你只在活动恢复后调用它。 - shaktiman_droid

7
当屏幕方向改变时,它会调用 onSaveInstanceState 方法,并将状态保存在 Bundle 对象中,包括堆栈。如果您在不清除此堆栈的情况下关闭对话框,则在旋转手机时它将显示对话框,因为它在 saveInstanceState bundle 中。
您必须使用以下方法清除堆栈中的对话框:
getActivity().getSupportFragmentManager().beginTransaction().remove(this).commit();

如果您使用支持库来创建对话框片段,或者……
getActivity().getFragmentManager().beginTransaction().remove(this).commit();

0

当配置更改(如旋转)发生时,旧的 Fragment 不会被销毁 - 它只是在重新创建时将自己添加回 Activity 中(Android 默认保留片段)。因此,如果您在旋转之前显示了 DialogFragment,它将在旋转后立即显示。


不,我之前没有看到过DialogFragment在旋转屏幕时重新出现的情况。如果它已经被打开和关闭过一次,那么在屏幕旋转时它会再次出现。 - Gasta87
但是您之前说过,“如果我在打开对话框之前旋转屏幕,什么都不会发生”。那里错了吗? - nikis
有两种情况:1)我从未长按editText 2)我至少长按了一次editText。在第一种情况下,当屏幕方向改变时,对话框不会出现。在第二种情况下,当通过单击OK按钮关闭对话框(即调用dialog.dismiss())后,当屏幕方向再次改变时,对话框会神奇地重新出现(就像我又长按了editText一样)。 - Gasta87

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接