for Ex.
我有底部导航有 4 个选项卡
当我从 A-->B 然后 B->A 然后 A-->B然后 B-->A 导航时然后按返回 ---> B - A - B - A
我想要删除此重复项,因此如果我按回应该为 B - A,然后退出应用程序
public class MainActivity extends BaseActivity implements BottomNavigation.OnMenuItemSelectionListener {
private BottomNavigation mBottomNavigation;
private List<Integer> openedTabs = new ArrayList<>();
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initializeViewComponents();
}
private void initializeViewComponents() {
mBottomNavigation = (BottomNavigation) findViewById(R.id.BottomNavigation);
if (null != mBottomNavigation) {
if (openedTabs.size() == 0) {
openedTabs.add(0);
}
mBottomNavigation.setDefaultSelectedIndex(0);
mBottomNavigation.setOnMenuItemClickListener(this);
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.menu_my_contacts, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
int id = item.getItemId();
if (id == R.id.menu_contacts_search) {
}
return false;
}
@Override
public void onBackPressed() {
super.onBackPressed();
if (openedTabs.size() > 0) {
int lastIndex = openedTabs.size() - 1;
int beforeTheCurrent = lastIndex - 1;
if (beforeTheCurrent >= 0) {
mBottomNavigation.setSelectedIndex(openedTabs.get(beforeTheCurrent), true);
printLog("OnBackPressed", "Size: " + openedTabs.size() + " ---> LastIndex: " + lastIndex + " ---> Current: " + openedTabs.get(lastIndex) + "Go To: " + openedTabs.get(beforeTheCurrent));
openedTabs.remove(lastIndex);
}
}
}
@Override
public void onMenuItemSelect(@IdRes int i, int i1) {
openedTabs.add(i1);
switch (i) {
case R.id.profile:
printLog("Item", "profile");
replaceFragment(new ProfileFragment());
break;
case R.id.my_contacts:
printLog("Item", "my_contacts");
replaceFragment(new MyContactsFragment());
break;
case R.id.requests:
printLog("Item", "requests");
replaceFragment(new RequestsFragment());
break;
case R.id.settings:
printLog("Item", "settings");
replaceFragment(new SettingsFragment());
break;
}
}
@Override
public void onMenuItemReselect(@IdRes int i, int i1) {
}
private void replaceFragment(Fragment fragment) {
FragmentManager manager = getSupportFragmentManager();
FragmentTransaction transaction = manager.beginTransaction();
transaction.replace(R.id.fragmentContainer,fragment);
transaction.addToBackStack(null);
transaction.commit();
}
}
您总是将事务添加到backStack中,因此,如果您按下按钮返回,您会返回用户所做的整个导航,这是正常的。
也许你可以尝试将事务添加到backStack transaction.addToBackStack(null);
,只有当它没有相同的片段时: fragmentManager.findFragmentByTag(TAG)
.
使用它,您必须为要替换的每个不同片段分配不同的标签:
所以,试试这个:
private void replaceFragment(Fragment fragment, String tag) {
FragmentManager manager = getSupportFragmentManager();
FragmentTransaction transaction = manager.beginTransaction();
transaction.replace(R.id.fragmentContainer,fragment);
if (fragmentManager.findFragmentByTag(tag) == null)
transaction.addToBackStack(null);
transaction.commit();
你这样调用这个函数:
switch (i) {
case R.id.profile:
printLog("Item", "profile");
replaceFragment(new ProfileFragment(), "profile");
break;
case R.id.my_contacts:
printLog("Item", "my_contacts");
replaceFragment(new MyContactsFragment(), "my_contacts");
break;
case R.id.requests:
printLog("Item", "requests");
replaceFragment(new RequestsFragment(), "requests");
break;
case R.id.settings:
printLog("Item", "settings");
replaceFragment(new SettingsFragment(), "settings");
break;
}
您实际上在onMenuItemSelect(..)
中创建了一个新实例,并将每个人添加到 backstack 中。因此,如果此片段类型已经存在,请删除您的addtoBackStack(null)(因此它不会被多次添加到backstack中),或者避免每次用户在选项卡之间切换时创建新实例,例如通过将片段保存在
Fragment[] myfrags = new Fragment[4]; //4 means count of your different fragments)
或以您的 IdRes 为键,片段作为值的哈希图