BottomNavigationView点击backpress时如何高亮相应的fragment item图标?
How to highlight the corresponding fragment item icon in BottomNavigationView while clicking on backpress?
我有一个 BottomNavigationView,3 item 选项卡位于 screen.Each 个项目选项卡中有 两个片段。我正在单击此流程,Item1Fragment -> Item2Fragment -> Item3Fragment-> SubItem3Fragment1 -> SubItem3Fragment2。因此,当我从 Item3Fragment backpress 时,Item2Fragment 和 Item1Fragment 的 对应的项目图标被突出显示。
我指的是这个post
我需要的是当我从 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();
}
}
我通过获取 片段名称 解决了这个问题,使用我为 分配 id 的片段名称tabItem。然后使用 tabItem id
Menu menu = bottomNavigationView.getMenu();
MenuItem menuItem = menu.getItem(tabId);
menuItem.setChecked(true);
我有一个 BottomNavigationView,3 item 选项卡位于 screen.Each 个项目选项卡中有 两个片段。我正在单击此流程,Item1Fragment -> Item2Fragment -> Item3Fragment-> SubItem3Fragment1 -> SubItem3Fragment2。因此,当我从 Item3Fragment backpress 时,Item2Fragment 和 Item1Fragment 的 对应的项目图标被突出显示。
我指的是这个post
我需要的是当我从 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();
}
}
我通过获取 片段名称 解决了这个问题,使用我为 分配 id 的片段名称tabItem。然后使用 tabItem id
Menu menu = bottomNavigationView.getMenu();
MenuItem menuItem = menu.getItem(tabId);
menuItem.setChecked(true);