Как выделить соответствующий значок элемента фрагмента в BottomNavigationView при нажатии на кнопку обратного нажатия?

У меня есть BottomNavigationView с 3 вкладками элементов внизу экрана. Каждая из вкладок элементов имеет два фрагмента. сильный> в этом. Я нажимаю на этот поток, Item1Fragment -> Item2Fragment -> Item3Fragment-> SubItem3Fragment1 -> SubItem3Fragment2. Поэтому, когда я отжимаю от Item3Fragment , Item2Fragment и Item1Fragment, соответствующие значки элементов выделяются.

Я имею в виду этот пост Изменить значки BottomNavigationView при нажатии кнопки "Назад"

Что мне нужно, так это то, что когда я нажимаю от Item3Fragment, поток должен быть SubItem3Fragment1 (значок 3-го элемента выделен) -> Item3Fragment (значок 3-го элемента выделен) -> Item2Fragment (значок 2-го элемента выделен)-> Item1Fragment (значок 1-го элемента выделен)

Я вызываю SubItemFragments с помощью transaction.addToBackStack("subfrag");

Deque<Integer> mStack = new ArrayDeque<>();
boolean isBackPressed  = false;

private void setBottomNavigationView() {
    mBottomNavigationView.setOnNavigationItemSelectedListener(new BottomNavigationView.OnNavigationItemSelectedListener() {
        @Override
        public boolean onNavigationItemSelected(@NonNull MenuItem item) {
            switch (item.getItemId()) {
                case R.id.ic_home:
                     if(!isBackPressed) {
                       pushFragmentIntoStack(R.id.ic_home);
                   }
                    isBackPressed = false
                    setFragment(HomeFragment.newInstance(), HOME_FRAGMENT);
                    return true;
                case R.id.ic_search:
                    if(!isBackPressed) {
                       pushFragmentIntoStack(R.id.ic_search);
                   }
                    isBackPressed = false
                    setFragment(SearchFragment.newInstance(), SEARCH_FRAGMENT);
                    return true;
                case R.id.ic_circle:
                    if(!isBackPressed) {
                       pushFragmentIntoStack(R.id.ic_circle);
                   }
                    isBackPressed = false
                    setFragment(ShareFragment.newInstance(), SHARE_FRAGMENT);
                    return true;

                default:
                    return false;
            }
        }
    });
    mBottomNavigationView.setOnNavigationItemReselectedListener(new 
          BottomNavigationView.OnNavigationItemReselectedListener() {
        @Override
        public void onNavigationItemReselected(@NonNull MenuItem item) {

        }
    });
 mBottomNavigationView.setSelectedItemId(R.id.ic_home);
 pushFragmentIntoStack(R.id.ic_home);
}

private void pushFragmentIntoStack(int id)
{
    if(mStack.size() < 3)
    {
        mStack.push(id);
    }
    else
    {
        mStack.removeLast();
        mStack.push(id);
    }
}

private void setFragment(Fragment fragment, String tag) {
    FragmentTransaction transaction = mFragmentManager.beginTransaction();
    transaction.replace(R.id.container, fragment, tag);
    transaction.commit();
}

@Override
public void onBackPressed() {
    if(mStack.size() > 1)
    {
        isBackPressed = true;
        mStack.pop();
        mBottomNavigationView.setSelectedItemId(mStack.peek());
    }
    else 
    {
        super.onBackPressed();
    }
}

person Meena Dev    schedule 09.01.2019    source источник


Ответы (1)


Я исправил этот случай, получив имя фрагмента, используя имя фрагмента. Я назначаю id для tabItem. Затем, используя tabItem идентификатор

 Menu menu = bottomNavigationView.getMenu();
 MenuItem menuItem = menu.getItem(tabId);
 menuItem.setChecked(true);
person Meena Dev    schedule 11.01.2019