android - 如果我在这个 fragment 之间导航多次,如何只为每个 fragment 保留一个实例

标签 android android-fragments fragment

对于前。

我的底部导航有 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); 只有当它上面没有相同的 fragment 时: fragmentManager.findFragmentByTag(TAG)

要使用它,您必须为要替换的每个不同 fragment 分配不同的标签:

那么,试试这个:

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;

}

关于android - 如果我在这个 fragment 之间导航多次,如何只为每个 fragment 保留一个实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38344894/

相关文章:

android - 使用 Google Play 应用内结算的一次性购买的时间试用

java - Roblox 论坛、网页抓取应用程序 (Android) 问题

java - 如何将 ScrollView 添加到抽屉导航

Android - 后退按钮和 fragment 后退堆栈不起作用

android - 在首选项标题中突出显示选定的标题

java - 为什么不调用所选上下文项上的函数

javascript - 安卓浏览器 : programmatically change focused input value

android - 第 1 部分持久性前台 android 服务,由 UI 启动,也可在 sleep 模式下工作,也可在手机重启时启动

xml - 找不到属性 layout_scrollFlags

android - 自动重新设置首选项?