DialogFragment не удаляется - PullRequest
2 голосов
/ 10 февраля 2012

Я создаю DialogFragment, используя этот код

Fragment prev = getSupportFragmentManager().findFragmentByTag(DIALOG_SUBMISSIOIN_RESPONSE);
AlertDialogFragment alert = AlertDialogFragment.newInstance(text, getString(R.string.worklog_alert_ok));
alert.show(getSupportFragmentManager(), DIALOG_SUBMISSIOIN_RESPONSE);

где AlertDialogFragment - это простой класс DialogFragment, который создает новый AlertDialog.Builder (..).

Тогда я хочу удалить диалог

Fragment prev = getSupportFragmentManager().findFragmentByTag(dialogTag);
if (prev != null) {
        FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
        transaction.remove(prev).commit();
}
Log.d(TAG, "dialog removed " + getSupportFragmentManager().findFragmentByTag(dialogTag) + ", isremoving = " + prev.isRemoving());

Однако в последнем сообщении Log.d я все еще получаю этот фрагмент (т.е. getSupportFragmentManager().findFragmentByTag(dialogTag) не равен нулю, но возвращает действительный фрагмент).

Как заставить диалоговое окно быть немедленно удаленным? Это важно для меня, потому что у меня есть код, который выполняется после этой функции, и он проверяет, существует ли диалоговое окно, затем ничего не делает, если не существует, а затем создает его заново. Однако он никогда не воссоздает его, потому что getSupportFragmentManager().findFragmentByTag(dialogTag) возвращает действительный DialogFragment.

Я использую пакет совместимости Android, версия Android 2.2

Ответы [ 3 ]

2 голосов
/ 21 августа 2013

Попробуйте позвонить executePendingTransactions() сразу после commit(). Это заставит транзакцию быть выполненной немедленно. Вызов commit() только назначает транзакцию в будущем, так что, скорее всего, это ваша проблема.

1 голос
/ 31 марта 2012

Попробуйте использовать transaction.remove(prev).commitAllowingStateLoss().

0 голосов
/ 06 апреля 2015

Вы можете отобразить и скрыть диалоговое окно фрагмента для ваших процессов, например:

 public void showLoadingDialog() {
      LoadingDialogFragment fragment = (LoadingDialogFragment) getSupportFragmentManager().findFragmentByTag(LoadingDialogFragment.FRAGMENT_TAG);
      if (fragment == null) {
         fragment = new LoadingDialogFragment();
         fragment.setCancelable(false);
         getSupportFragmentManager().beginTransaction()
                                    .add(fragment, LoadingDialogFragment.FRAGMENT_TAG)
                                    .commitAllowingStateLoss();

         // fragment.show(getSupportFragmentManager().beginTransaction(), LoadingDialogFragment.FRAGMENT_TAG);
      }
   }

   public void hideLoadingDialog() {
      LoadingDialogFragment fragment = (LoadingDialogFragment) getSupportFragmentManager().findFragmentByTag(LoadingDialogFragment.FRAGMENT_TAG);
      if (fragment != null) {
         // fragment.dismissAllowingStateLoss();
         getSupportFragmentManager().beginTransaction().remove(fragment).commitAllowingStateLoss();
      }
   }

Я думаю, это тебе поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...