Итак, у меня есть основной вид деятельности, в котором размещены все фрагменты моего приложения. Позвольте мне просто сказать заранее, что каждый раз, когда я открываю новый фрагмент, я делаю это так:
FragmentTransaction ft = getFragmentManager().beginTransaction();
ft.replace(vg.getId(), new MyFragment()); //obviously MyFragment varies from usage to usage but nothing else
ft.addToBackStack("My Fragment's Name");
ft.commit();
MyFragment
в этом случае расширяет androidx.fragment.app.Fragment
, который имеет только метод getFragmentManager()
. Он НЕ имеет getSupportFragmentManager()
.
Если я хочу go вернуться к предыдущему фрагменту, из текущего показанного фрагмента я бы сделал getFragmentManager().popBackStackImmediate()
. Однако, если я хочу извлечь backstack из действия, я должен использовать getSupportFragmentManager().popBackStackImmediate()
, иначе ничего не произойдет. Это заставило меня предположить, что вызов getFragmentManager()
из фрагмента вернул ту же ссылку, что и вызов getSupportFragmentManager()
из действия. Однако, если я пытаюсь запустить getSupportFragmentManager().getBackStackEntryAt(/* an int */)
из основного действия, я получаю исключение NullPointerException. Если я запускаю getSupportFragmentManager().getBackStackEntryCount()
из основного действия, оно всегда возвращает ноль.
Так почему же тогда getSupportFragmentManager()
в основном действии одновременно работает и не работает? Почему я могу использовать его для извлечения backstack, но не могу получить доступ к самому backstack из основного действия? Я совершенно невежественен. Хотелось бы получить помощь.
РЕДАКТИРОВАТЬ: Это мой onBackPressed ():
@Override
public void onBackPressed() {
getSupportFragmentManager().popBackStackImmediate();
getWindow().setSoftInputMode(defaultSoftInputMode);
try {
String fragmentName = getSupportFragmentManager().getBackStackEntryAt(getSupportFragmentManager().getBackStackEntryCount() - 1).getName();
Toast.makeText(getApplicationContext(), fragmentName, Toast.LENGTH_SHORT).show(); // Debug to see if the correct name is being shown
} catch (NullPointerException npe) {
// Print to console
// It always catches an error here and I don't know why
}
}
Специфический метод c, который вызывает исключение getSupportFragmentManager().getBackStackEntryAt(int index)
. Дальнейшая проверка показывает, что этот метод запрашивает ArrayList<BackStackRecord>
для значения, но исключение происходит, потому что это ArrayList
равно нулю.