BackStackNavigation 不适用于 NavigationDrawer

BackStackNavigation not working with NavigationDrawer

根据我在这里找到的一些帖子,我已经正确地实现了 BackStackNavigation,但是每当我在任何片段上按下后退按钮时,应用程序都会弹出当前片段,显示前一个片段的闪光,然后退出。我无法解决这个问题。任何帮助都感激不尽。是我做错了还是有其他问题?

我的应用程序的结构是,

MainActivity -> NavigationDrawerFragment -> 1. RecyclerViewFragment -> TextViewFragment
                                            2. SlidingTabStrips.ViewPager (Fragment)
                                            3. Some Code (No fragments)

这是 MainActivity 中覆盖的 onBackPressed

@Override
    public void onBackPressed() {
        super.onBackPressed();
        getFragmentManager().popBackStack(backStack[TOP],
                FragmentManager.POP_BACK_STACK_INCLUSIVE);
        backStack[TOP] = null;
        TOP--;
        Log.e("BACK_STACK_COUNT_ON_POP",Integer
                .toString(getFragmentManager().getBackStackEntryCount()));
        Log.e("TOP",Integer.toString(TOP));
    }

现在我用这种方式替换 NavigationDrawer 中的片段:

switch(position) {
            case 0: //Events
                fragmentManager.beginTransaction().replace(R.id.container,
                        EventsRecyclerViewFragment.newInstance(position + 1))
                        .addToBackStack(EVENT_RV_FRAGMENT).commit();
                ++TOP;
                backStack[TOP] = EVENT_RV_FRAGMENT;
                break;

            case 1: //User
                fragmentManager.beginTransaction().replace(R.id.container,
                        UserFragment.newInstance(position + 1))
                        .addToBackStack(USER_FRAGMENT).commit();
                ++TOP;
                backStack[TOP] = USER_FRAGMENT;
                break;

            case 2: //Logout
                SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
                if(prefs.getBoolean(KEY_LOGIN, false)) {
                    prefs.edit().remove(KEY_LOGIN).apply();
                    prefs.edit().remove(KEY_USERNAME).apply();
                    prefs.edit().remove(KEY_PASSWORD).apply();
                    Intent intent = getIntent();
                    intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
                    finish();
                    startActivity(intent);
                    Customs.mToast(getBaseContext(), "Logged-out");
                }
                break;
        } 

这就是我在 RecyclerViewFragment 中调用 TextViewFragment 的方式:

getFragmentManager().beginTransaction()
                            .replace(R.id.container, eventFragment)
                            .addToBackStack(EVENT_FRAGMENT)
                            .commit();
                    ++TOP;
                    backStack[TOP] = EVENT_FRAGMENT;

已加载 NavigationDrawer onCreate:

当我从上面点击事件时打开 RecyclerViewFragment:

当我点击上面显示的其中一张卡片时打开 TextViewFragment:

一个非常简短的工作示例...我没有检查它是否是一个 API 问题,它在 21 级上是这样工作的。

使用 addToBackstack = false 添加第一个片段,使用 addToBackstack = true 添加另一个片段。

Activity(xml 仅包含 ID 为 rlRoot 的相对布局)

public class FragActivity extends ActionBarActivity {

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.frag_activity);

    addFragment(new Frag1(), false, Frag1.TAG);

    addFragment(new Frag2(), true, Frag2.TAG);

}

private void addFragment(Fragment fragment, boolean addToBackStack, String tag) {

    FragmentTransaction trans = getSupportFragmentManager().beginTransaction();
    trans.replace(R.id.rlRoot, fragment, tag);
    if(addToBackStack) trans.addToBackStack(tag);
    trans.commit();

}

}

碎片

public class Frag1 extends Fragment {

public static final String TAG = Frag1.class.getSimpleName();

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

    TextView tv = new TextView(getActivity());
    tv.setText(String.valueOf(1));
    return tv;

}

}

public class Frag2 extends Fragment {

public static final String TAG = Frag1.class.getSimpleName();

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

    TextView tv = new TextView(getActivity());
    tv.setText(String.valueOf(2));
    return tv;

}

}

好的,我找到了解决方案。

onBackPressed()ActionBarActivity.class 中的原始实现是..

public void onBackPressed() { /* compiled code */ }

所以当我们想从堆栈中移除顶部框架时,我们必须在 overridden onBackPressed() 中调用 getFragmentManager().popBackStack()。 当堆栈为空调用 super.onBackPressed() 时,它没有任何内容,因此应用程序将简单地退出。

重写的 onBackPressed() 应该是这样的:

@Override
    public void onBackPressed() {
        if (getFragmentManager().getBackStackEntryCount() > 0) {
            getFragmentManager().popBackStack();
        }
        else {
            super.onBackPressed();
        }
    }