这里有部分活动,其中屏幕方向改变:
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中出现的对话框应该出现在onLongClick之后的editText上 (我知道当屏幕方向改变时,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;
}
非常感谢您的帮助。
答案 0 :(得分:8)
尝试使用片段管理器从堆栈中删除对话框,而不是仅仅解除它。
getFragmentManager().beginTransaction().remove(dialogFragment.this).commit();
顺便说一下,您应该使用Fragment
本身,而不是仅使用DialogFragment
作为对话框。结帐:DialogFragment
另外,不要像这样调用你的活动方法(((Main)getActivity()).setTextOnEditText(textDialog);
,除非你的片段是一个静态的内部类。而是创建一个interface
来讨论片段和活动。
答案 1 :(得分:7)
当屏幕改变方向时,它调用onSaveInstanceState方法,并将状态保存在包括堆栈的Bundle对象中。如果在不清除此堆栈的情况下关闭对话框,则在旋转手机时会显示该对话框,因为它位于saveInstanceState包中。
您必须通过以下方式清除堆栈中的对话框:
getActivity().getSupportFragmentManager().beginTransaction().remove(this).commit();
如果您对对话框片段使用支持库,或
getActivity().getFragmentManager().beginTransaction().remove(this).commit();
答案 2 :(得分:0)
当发生配置更改(如旋转)时,旧的Fragment不会被销毁 - 它只是在重新创建时将自身添加回Activity(默认情况下android保留片段)。因此,如果您在旋转前显示DialogFragment
,它会在旋转后立即显示。