LiveData: диалог через DialogFragment воссоздается дважды после изменения ориентации

У меня есть объект liveData, который я использую для контроля, когда отображается диалоговое окно с предупреждением или нет. этот диалог оповещения основан на DialogFragment. Предупреждение отображается, когда onChanged(true) вызывается для этого liveData.

Теперь, когда отображается предупреждение и меняется ориентация, предупреждение создается дважды, один поверх другого. Похоже, это происходит потому, что Android по умолчанию заново создает предупреждение, когда меняется ориентация, но затем liveData onChanged(true) снова вызывается при изменении ориентации. Таким образом, предупреждение создается дважды.

Есть ли способ запретить Android заново создавать само диалоговое окно, чтобы я мог самостоятельно обработать воссоздание через объект LiveData?

Благодарю.

3 ответа

Поскольку это диалог, вы можете сделать объект диалога пустым каждый раз, когда он закрывается, и при его создании создайте новый объект. И каждый раз проверять нулевой регистр, если он не нулевой, не открывать другой диалог. Если ноль, то только откройте диалог.

Вы должны попытаться проверить с помощью if ()

getFragmentManager().findFragmentByTag("dialog");

или же

getFragmentManager().findFragmentById("idOfDialog")

верните ноль, если да, нет диалогового окна, и вы можете создать новый. Другое решение я использовать, обрабатывать изменения конфигурации. https://developer.android.com/guide/topics/resources/runtime-changes Таким образом, вы можете поместить своего наблюдателя liveData в onCreate, и он не будет срабатывать во время вращения, только при изменении liveData, но это больше Сложно сделать.

Это происходит потому, что когда изменения конфигурации произошли, сам андроид создает еще один слой поверх него. надеюсь, это поможет.

if (savedInstanceState == null) {
    // only create fragment if activity is started for the first time
    mFragmentManager = getSupportFragmentManager();
    FragmentTransaction fragmentTransaction = mFragmentManager.beginTransaction();

    FragmentOne fragment = new FragmentOne();

    fragmentTransaction.add(R.id.fragment_container, fragment);
    fragmentTransaction.commit();
} else {        
    // do nothing - fragment is recreated automatically
}