#android
#Android
Вопрос:
У меня есть приложение с одним действием и двумя фрагментами. Фрагмент B добавляется (addedToBackStack) поверх фрагмента A. Во фрагменте B я показываю диалоговое окно, возвращаюсь к фрагменту A и затем закрываю диалоговое окно. Если getActivity()!=null
проверка удалена внутри обработчика, код работает нормально. Но getActivity()
имеет значение null внутри обработчика. Почему getActivity()
null внутри обработчика в следующем фрагменте кода?
private void showDialog(final Dialog dialog) {
dialog.show();
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
if (getActivity()!=null amp;amp; !getActivity().isFinishing()) {
dialog.dismiss();
}
}
}, 1000);
if (getActivity() != null amp;amp; !getActivity().isFinishing())
getActivity().onBackPressed();
}
Ответ №1:
getActivity()
имеет значение null, потому что после getActivity().onBackPressed();
вызова ваш фрагмент будет отделен от Activity
. Таким образом, внутри обработчика он всегда будет иметь значение null, потому что он вызывается с задержкой. Если вы хотите закрыть диалоговое окно через одну секунду, а также вернуться к предыдущему фрагменту, то вам следует перейти onBackPressed
внутрь метода run. я заменил нулевую проверку на isAdded()
.
private void showDialog(final Dialog dialog) {
dialog.show();
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
if (isAdded()) {
dialog.dismiss();
getActivity().onBackPressed();
}
}
}, 1000);
}
Комментарии:
1. Но как работает код, если в моем коде удалена проверка getActivity()? будет ли диалоговое окно содержать экземпляр даже после уничтожения фрагмента?
2.
isAdded()
делает то же самое . Он проверяет, что Фрагмент присоединен к действию, если нет, то он вернет false .