Отклонение DialogFragment программно
Как программно отклонить DialogFragment? В настоящее время я создаю диалоги:
void showDialogWithId(int id){
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
Fragment prev = getSupportFragmentManager().findFragmentByTag("dialog");
if (prev != null) {
ft.remove(prev);
}
ft.addToBackStack(null);
if (id == SEARCHING_DIALOG){
// Create and show the dialog.
DialogFragment newFragment = MyDialogFragment.newInstance(SEARCHING_DIALOG,"TEST");
newFragment.show(ft, "dialog");
}
if (id == CONNECTING_DIALOG){
// Create and show the dialog.
DialogFragment newFragment = MyDialogFragment.newInstance(CONNECTING_DIALOG,"TEST");
newFragment.show(ft, "dialog");
}
if (id == CONNECTIVITY_DIALOG){
// Create and show the dialog.
DialogFragment newFragment = MyDialogFragment.newInstance(CONNECTIVITY_DIALOG);
newFragment.show(ft, "dialog");
}
}
И я ожидаю отклонить их:
public void dismissDialog(){
getFragmentManager().popBackStack();
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
Fragment prev = getSupportFragmentManager().findFragmentByTag("dialog");
if (prev != null) {
ft.remove(prev);
}
ft.addToBackStack(null);
}
Однако диалоги не увольняются...
Ответы
Ответ 1
Попробуйте использовать
getDialog().dismiss();
Внутри диалоговых окон. Например, вы можете найти DialogFragment своим тегом, как вы это делаете, а затем вызвать на нем какой-то метод, который вызывает этот код. Обычно я не инициирую отклонение DialogFragment из Activity, мои диалоговые кнопки делают это для меня. Но я думаю, что это тоже должно работать. Я не уверен, как это повлияет на фрагмент backstack tho.
Ответ 2
Чтобы агрегировать предыдущий ответ и связанные с ним комментарии, удалите диалоговое окно, которое вы должны выполнить:
public void dismissDialog(){
Fragment prev = getSupportFragmentManager().findFragmentByTag("dialog");
if (prev != null) {
DialogFragment df = (DialogFragment) prev;
df.dismiss();
}
}
Ответ 3
В моем случае использования я делаю следующее:
В действии (или любом другом месте) от вас отображается диалог, определяющий переменную-член:
private DialogFragment mMyDialog;
Затем назначьте mMyDialog перед его отображением:
mMyDialog = MyDialog.newInstance(...whatever vars...); // MyDialog is extended from DialogFragment
mMyDialog.show();
И, наконец, в том месте, где вам нужно отменить диалог, скажите:
if (mMyDialog != null) {
mMyDialog.dismiss();
mMyDialog = null;
}
Ответ 4
MyProgressDialog
- это класс, который расширяет DialogFragment
//Как показать
MyProgressDialog pd = new MyProgressDialog();
Bundle b = new Bundle();
b.putString(ProgressDialog.PROGRESS_TITLE, "Loading data");
b.putString(ProgressDialog.PROGRESS_MESSAGE, "Getting your data from server");
b.putBoolean(ProgressDialog.PROGRESS_IS_CALLBACK_NEEDED, false);
pd.setArguments(b);
pd.show(getActivity().getSupportFragmentManager(), ProgressDialog.class.getSimpleName());
//Как отклонить
if (pd != null && pd.isAdded()) {
pd.dismiss();
pd = null;
}