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

这里有一部分屏幕方向改变的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被重新启动,但是它不会像第一次创build时那样正常启动? )

我的问题是:当我至less打开一次对话框并将其closures后,在屏幕方向改变之后,我再次在屏幕上显示对话框,就像我长按了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; } 

非常感谢帮忙。

尝试使用片段pipe理器从堆栈中删除对话框,而不是只是解雇它。

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

顺便说一句,而不是只使用对话框的Fragment ,你应该使用DialogFragment本身。 结帐: DialogFragment

另外,不要像这样调用你的活动方法( ((Main)getActivity()).setTextOnEditText(textDialog);除非你的片段是一个静态的内部类,而是创build一个interface来在片段和活动之间进行交谈。

当屏幕改变方向时,它调用onSaveInstanceState方法,并将其保存在包括堆栈的Bundle对象中。 如果您在不清除此堆栈的情况下closures对话框,则会在旋转手机时显示对话框,因为它位于saveInstanceState包中。

您必须清除堆栈中的对话框:

 getActivity().getSupportFragmentManager().beginTransaction().remove(this).commit(); 

如果您使用对话框片段的支持库,或者

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

当一个configuration发生变化(比如旋转)时,旧的Fragment不会被销毁 – 它只是在重新创build时将自己添加到Activity中(默认情况下,android会保留片段)。 所以如果你在旋转之前显示你的DialogFragment ,它会在旋转后立即显示出来。