Android将新的/不同的片段添加到后台

时间:2016-03-28 06:41:27

标签: android android-fragments android-menu android-navigation fragmentmanager

我有一个导航抽屉设置,在菜单项上单击将使用菜单中选择的新片段替换片段容器:

public boolean onNavigationItemSelected(MenuItem item) {
        // Handle navigation view item clicks here.
        int id = item.getItemId();

        switch (id) {
            case R.id.nav_new:
                if (subInfo.isEmpty()){
                    addFragment(new NewFragment(), id);
                } else {
                    addFragment(new SubjectInfoFragment(), id);
                }
                break;
            case R.id.nav_start:
                addFragment(new StartFragment(), id);
                break;
            case R.id.nav_save:
                addFragment(new SaveFragment(), id);
                break;
            case R.id.nav_raw:
                addFragment(new RawFragment(), id);
                break;
            case R.id.nav_accelerometer:
                addFragment(new AccelerometerFragment(), id);
                break;
            case R.id.nav_accelerometerWorld:
                addFragment(new AccelerometerWorldFragment(), id);
                break;
            case R.id.nav_gyroscope:
                addFragment(new GyroscopeFragment(), id);
                break;
        }

        DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
        drawer.closeDrawer(GravityCompat.START);
        return true;
    }

添加片段的方法:

public void addFragment(Fragment fragment, int id) {
        if (fragment != null) {
            FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();

            if (fragmentManager.getFragments() == null) {
                fragmentTransaction.replace(R.id.fragment_container, fragment, fragment.getClass().getSimpleName())
                        .commit();
            } else {
                fragmentTransaction.replace(R.id.fragment_container, fragment, fragment.getClass().getSimpleName())
                        .addToBackStack(Integer.toString(id))
                        .commit();
            }
        }
    }

在我的一个片段(NewFragment())中有一个数据插入表单,该菜单项的ID为nav_new。单击提交按钮后,将调用addFragment方法将用户定向到我的应用中的另一个片段(StartFragment()):

mainActivity.addFragment(new StartFragment(), R.id.nav_new);

但是,上面会将数据插入表单添加到Backstack中。用户提交表单后,我不希望他们能够返回以返回提交表单。相反,我想将它们引导到另一个片段(SubjectInfoFragment()),其中包含他们输入的信息摘要

我设计了onNavigationItemSelected方法来支持这一点。单击nav_new菜单项时,它会检查用户是否已输入任何信息。如果他们没有,则会发生交易,将他们带到NewFragment以输入表单信息。如果有,则会显示SubjectInfoFragment,以显示其先前输入的信息的摘要

我必须在表单提交时将它们指向StartFragment,然后将旧表单片段添加到backstack中,这是不可取的

表单提交后,如何处理片段事务,以便后退按钮将它们带到一个全新的片段(SubjectInfoFragment)而不是将它们带回到表单提交页面?

或者在最糟糕的情况下,如果我无法在backstack中添加一个全新的片段,我怎么能至少阻止用户回到表单提交页面?

1 个答案:

答案 0 :(得分:0)

您应该使用以下行将片段添加到backstack:

getFragmentManager.addToBackStack(tag or null);