После изменения ориентации экрана диалоговое окно Фрагмент появляется, по-видимому, без вызова
Здесь есть часть действия, где изменение ориентации экрана:
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 (я знаю, что при изменении ориентации экрана действие перезапускается, но оно не должно запускаться нормально, как при первом создании?)
Моя проблема: когда я по крайней мере один раз открываю диалоговое окно и закрываю его, после изменения ориентации экрана диалоговое окно снова отображается на экране, как если бы я долго щелкал текст редактирования.
Я не совсем знаю, почему это происходит.
Я также прикрепляю структуру фрагмента диалога:
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;
}
Большое спасибо за помощь.
3 ответа
Попробуйте удалить диалог из стека с помощью диспетчера фрагментов, а не просто отклонить его.
getFragmentManager().beginTransaction().remove(dialogFragment.this).commit();
Кстати, вместо того, чтобы просто использовать Fragment
для вашего диалога вы должны использовать DialogFragment
сам. Оформить заказ: DialogFragment
Кроме того, никогда не называйте ваши методы деятельности, как это (((Main)getActivity()).setTextOnEditText(textDialog);
если ваш фрагмент не является статическим внутренним классом. Вместо этого создайте interface
говорить между фрагментами и деятельностью.
Когда экран меняет ориентацию, он вызывает метод onSaveInstanceState и сохраняет состояние в объекте Bundle, включая стек. Если вы закрываете диалоговое окно без очистки этого стека, оно будет отображать диалоговое окно при повороте телефона, поскольку оно находится в пакете saveInstanceState.
Вы должны очистить диалог из стека с помощью:
getActivity().getSupportFragmentManager().beginTransaction().remove(this).commit();
если вы используете библиотеку поддержки для фрагмента диалога, или
getActivity().getFragmentManager().beginTransaction().remove(this).commit();
Когда происходит изменение конфигурации (например, ротация), старый фрагмент не уничтожается - он просто добавляет себя обратно в действие при воссоздании (андроид сохраняет фрагменты по умолчанию). Так что если у вас есть DialogFragment
показанный перед вращением, он сразу же появится после вращения.