Как избежать запуска фрагмента при изменении ориентации?

Когда строка EditText в пользовательском интерфейсе получает фокус, запускается DatePickerFragment, чтобы пользователь мог ввести дату. При изменении ориентации, если строка EditText имеет фокус и ранее введенную дату (length() > 0) и запускает DatePickerFragment из-за приведенного ниже кода. Я не хочу, чтобы DatePickerFragment запускался после изменения ориентации. Есть ли способ изменить или добавить код, чтобы, если Activity был недавно создан, а строка EditText была в фокусе, он не запускал автоматически DatePickerFragment ? Было бы неплохо сделать что-то в onResume()? Или сделать что-то с !=null?

ListenerEditText.setOnFocusChangeListener(new OnFocusChangeListener() {
     @Override
     public void onFocusChange(View v, boolean hasFocus) {
     ...
        if (hasFocus && (fListenerEditText.getText().length() == 0)) {
           DatePickerFragment newFragment = new DatePickerFragment();
           newFragment.show(getSupportFragmentManager(), "datePicker");
        }
        else if (hasFocus) {
           ...
           DatePickerFragment newFragment = new DatePickerFragment();
           newFragment.show(getSupportFragmentManager(), "datePicker");
        }
     }
});

person AJW    schedule 01.10.2015    source источник


Ответы (2)


Если у вас есть requestFocus() на вашем Edittext, удалите его, сделайте что-то вроде этого; переместите нижнюю строку за пределы интерфейса

DatePickerFragment newFragment = new DatePickerFragment();

и внутри интерфейса перейти к логической атаке

if(newFragment.isShow())// true if shown false if not

и ваш оператор if проверяется таким образом

если и только если EditText имеет фокус и длина равна 0, показать диалоговое окно или если у него есть фокус показать диалоговое окно, здесь не больше 0

Надеюсь, я помог

person Elltz    schedule 01.10.2015
comment
Мигающий курсор находится в строке EditText, когда происходит изменение ориентации, поэтому строка EditText автоматически имеет фокус. У меня нет никакого requestFocus() в EditText. Не уверен, что вы подразумеваете под использованием isShow, мне придется исследовать это... как это поможет здесь? - person AJW; 01.10.2015

Перед добавлением нового DatePickerFragment проверьте, не существует ли он уже. Если он не существует, добавьте DatePickerFragment. Я предполагаю, что "datePicker" - это тег, который используется для транзакции фрагмента. Вы можете проверить фрагмент, используя

if (getSupportFragmentManager().findFragmentByTag("datePicker")==null) {
   //Add new DatePickerFragment
}

Дайте мне знать, если это поможет.

person android-smurf    schedule 01.10.2015
comment
Хорошо, я попробую это и скоро вернусь к вам. - person AJW; 01.10.2015
comment
Я использовал else if (hasFocus && (getSupportFragmentManager().findFragmentByTag(datePicker)==null)) и DatePickerFragment по-прежнему запускается после изменения ориентации. Непосредственно перед изменением ориентации курсор в строке EditText мигает, и строка имеет ранее введенную пользователем дату. После изменения ориентации я просто хочу, чтобы курсор снова мигал в строке EditText и чтобы увидеть ранее введенную дату. Я не хочу, чтобы DatePickerFragment запускался автоматически. - person AJW; 01.10.2015
comment
Я считаю, что перемещение кода для установки OnFocusChangeListener в onResume предотвратит вызов onFocusChange при изменении ориентации. - person android-smurf; 01.10.2015
comment
Правильно, но как мне запустить DatePickerFragment, если ориентация никогда не меняется? Мне все еще нужно, чтобы фрагмент запускался, если фокус перемещается откуда-то еще на строку EditText, а на строке есть ранее введенная дата. Любые идеи? - person AJW; 01.10.2015
comment
Чтобы было ясно, я предлагаю вам переместить блок кода, который вы разместили, в onResume в Activity. Таким образом, DatePickerFragment все равно должен запускаться, когда EditText получает фокус. - person android-smurf; 01.10.2015