Android получить идентификатор текущего фрагмента

У меня реализован навигационный ящик, но проблема в том, что при нажатии кнопки "Назад" отмеченный элемент на чертеже не соответствует текущему фрагменту (только последний фрагмент, который был фактически добавлен через навигационный ящик)

Существует решение для этого здесь: Обновление Навигационного Ящика (с DrawerLayout) при нажатии кнопки назад

Решение гласит следующее:

getSupportFragmentManager().addOnBackStackChangedListener(new FragmentManager.OnBackStackChangedListener() {
            @Override
            public void onBackStackChanged() {
                FragmentManager fm = getSupportFragmentManager();
                String stackName = null;
                for(int entry = 0; entry < fm.getBackStackEntryCount(); entry++){
                    stackName = fm.getBackStackEntryAt(entry).getName();
                    Log.i("BC", "stackEntry" + entry);
                }
                if (stackName == "Fragment1"){
                    mDrawerList.setItemChecked(0, true);
                } else if (stackName == "Fragment2") {
                    mDrawerList.setItemChecked(1, true);
                }

            });

Проблема с этим является условной. Необходимость вручную изменять индекс элемента навигации, который нужно проверить, является болью, когда у вас много элементов

То, что я хочу сделать, это прослушать изменение в backstack, и, если обнаружено, получить идентификатор текущего фрагмента (как определено в файле макета) и передать его до navigationView.setCheckedItem() для автоматической проверки соответствующего элемента навигации. Что-то вроде этого:

navigationView = (NavigationView) findViewById(R.id.nav_view);

navigationView.setCheckedItem(R.id.nav_new);

В моем классе mainacctivity, как я могу получить идентификатор текущего фрагмента в форме R.id.xxx так что я могу передать это setCheckedItem?

2 ответа

Решение

Вы могли бы сделать это

При добавлении фрагмента сделайте это

FragmentTransaction.addToBackStack(""+R.id.nav_new); // Use the id of navigation item which was clicked.

затем

getSupportFragmentManager().addOnBackStackChangedListener(new FragmentManager.OnBackStackChangedListener() {
    @Override
    public void onBackStackChanged() {
        FragmentManager fm = getSupportFragmentManager();
        String stackName = null;
        for(int entry = 0; entry < fm.getBackStackEntryCount(); entry++){
            stackName = fm.getBackStackEntryAt(entry).getName();
            Log.i("BC", "stackEntry" + entry);
        }

        int navItemId = -1;
        try{
            navItemId = Integer.parseInt(stackName);    
        } catch(NumberFormatException nfe) {
        }

        if(navItemId > 0){
            navigationView = (NavigationView) findViewById(R.id.nav_view);
            navigationView.setCheckedItem(navItemId);
        }
        else
            Log.e("", "Couldn't find the id");
    });

ПРИМЕЧАНИЕ: все, что вы пройдете в addToBackStack будет возвращен вам обратно, когда вы будете использовать getName() на FragmentManager.BackStackEntry

you can handle it manually.
Make a function in base class to highlight desired item like
mDrawerList.setItemChecked(INDEX NUMBER, true);

Trick is make a model class for side menu items in which INDEX NUMBER is saved.
When you replace new fragment call that function and store currentFragment a well.
and when you press back button ovverides

 public boolean onKeyDown(int keyCode, KeyEvent event) {}
and call below function

public void popAFragment(){
 FragmentManager fragmentManager = getSupportFragmentManager();
        if(fragmentManager != null){
            int c = fragmentManager.getBackStackEntryCount();
            if(c>0){
                currentFragment = (BaseFragment) fragmentManager.getFragments().get(c-1);
                fragmentManager.popBackStack();
                setPosition(currentFragment.INDEX_NUMBER);
            }
            else {
finish();
}
}
Другие вопросы по тегам