getSupportFragmentManager (). popBackStackImmediate () работает, но getSupportFragmentManager (). getBackStackEntryAt (index) нет - PullRequest
0 голосов
/ 19 февраля 2020

Итак, у меня есть основной вид деятельности, в котором размещены все фрагменты моего приложения. Позвольте мне просто сказать заранее, что каждый раз, когда я открываю новый фрагмент, я делаю это так:

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 равно нулю.

...