8

здесь есть часть деятельности, где изменение ориентации экрана:После изменения ориентации экрана по dialogFragment появляется, видимо, без вызова

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;     
     } 
    });   
} 

Apparentely, кажется, что диалог, который будет отображаться внутри DialogFragment должен появиться только после того, как onLongClick над EditText (я знаю, что, когда ориентация экрана изменить активность возобновляется, но не следует начинать, как правило, как в первый раз, который создается?)

Моей проблема: когда я открываю по крайней мере один раз диалог, и я закрываю его, после e Изменение ориентации экрана. У меня снова отображается диалог на экране, например, если я долго нажимал на 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

Таким образом, вы начинаете деятельность, не делать ничего, вращать устройство и появится диалоговое окно или начать actitity, нажмите EditText, повернуть устройство ... ? – nikis

+0

Вы уверены, что ваша деятельность перезапускается при вращении? Вы добавили какой-либо код, который может помешать перезапуску активности? как изменения конфигурации в манифесте? –

+0

@nikis нет, извините, если я поворачиваю экран перед открытием диалога, ничего не происходит. – Gasta87

ответ

8

Попробуйте удалить диалог из стека с помощью диспетчера фрагментов, а не просто отклонить его.

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

Кстати, вместо того, чтобы просто используя Fragment для вашего диалога, вы должны использовать DialogFragment себя. Оформление заказа:. DialogFragment

Кроме того, никогда не называй свои методы деятельности, как это (((Main)getActivity()).setTextOnEditText(textDialog); , если ваш фрагмент не является статическим внутренним классом Вместо создания interface говорить между фрагментами и активностью

+0

спасибо! оно работает! – GrafOrlov

+1

Я могу подтвердить, что этот метод работает, но в моей ситуации я столкнулся с этой проблемой просто потому, что забыл включить эту строку: 'super.onDismiss (dialog);' in' onDismiss'. Может быть, это поможет кому-то. – Storix

+0

Отличный комментарий - так как для меня ответ Jabbar был вызван 'java.lang.IllegalStateException: не удалось выполнить это действие после onSaveInstanceState' –

0

Когда происходит изменение конфигурации (например, поворот), старый фрагмент не уничтожается - он просто добавляет себя обратно в Activity, когда он воссоздан (андроид по-прежнему сохраняет фрагменты). Поэтому, если у вас есть ваш DialogFragment, показанный перед поворотом, он сразу же появится после поворота.

+0

Нет, у меня нет диалоговогофрагмента, показанного перед вращением. он появляется снова, когда экран вращается, если он был открыт и закрыт один раз. – Gasta87

+0

Но вы сказали выше, что «если я поворачиваю экран перед открытием диалога, ничего не происходит». Где ошибка? – nikis

+0

Есть два случая: 1) Я не нахожу onLongClick когда-либо editText 2) I onLongClick editText хотя бы один раз. В первом случае, когда меняется ориентация экрана, диалог не появляется. Во втором случае, когда диалог уже закрыт, нажав кнопку «ОК», создающую dialog.dismiss(), когда изменение ориентации экрана волшебным образом снова появится диалоговое окно (например, если я нахожусь в LONClick editText) – Gasta87

7

Когда экран меняет ориентацию. , он вызывает методSaveInstanceState и сохраняет состояние в объекте Bundle, включая стек. Если вы отклоните диалог без очистки этого стека, он отобразит диалоговое окно при повороте телефона, так как оно находится в пакете saveInstanceState.

Вы должны удалить диалог со стека с помощью:

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

, если вы используете библиотеку поддержки для диалога фрагмента или

getActivity().getFragmentManager().beginTransaction().remove(this).commit(); 
Смежные вопросы