如果我在此片段之间多次导航,如何只为每个片段保留一个实例



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 为键,片段作为值的哈希图

最新更新