Android BackbackNavigation不使用NavigationDrawer

Android BackbackNavigation不使用NavigationDrawer,android,android-fragments,navigation-drawer,back-stack,Android,Android Fragments,Navigation Drawer,Back Stack,根据我在这里找到的一些帖子,我已经正确地实现了BackbackNavigation,但每当我按下任何片段上的后退按钮,应用程序就会弹出当前片段,显示前一个片段的闪光,然后退出。我解决不了这个问题。任何帮助都将不胜感激。我是做错了还是有别的事 我的应用程序的结构是 MainActivity -> NavigationDrawerFragment -> 1. RecyclerViewFragment -> TextViewFragment

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

我的应用程序的结构是

MainActivity -> NavigationDrawerFragment -> 1. RecyclerViewFragment -> TextViewFragment
                                            2. SlidingTabStrips.ViewPager (Fragment)
                                            3. Some Code (No fragments)
这是在
main活动
中覆盖的
on backpressed

@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;
        } 
这就是我在RecycleServiceWfFragment中调用TextViewFragment的方式:

getFragmentManager().beginTransaction()
                            .replace(R.id.container, eventFragment)
                            .addToBackStack(EVENT_FRAGMENT)
                            .commit();
                    ++TOP;
                    backStack[TOP] = EVENT_FRAGMENT;
导航抽屉已加载
onCreate

当我从上面单击事件时,RecycleServicewFragment打开:

TextViewFragment在我单击上面显示的一张卡时打开:


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

添加addToBackstack=false的第一个片段,添加addToBackstack=true的另一个片段

活动(xml仅包含id为rlRoot的relativelayout)

}

碎片

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;

}
}


}好的,我找到了解决办法

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

public void onBackPressed(){/*编译代码*/}

因此,当我们想要从堆栈中删除顶部框架时,我们必须在
重写onBackPressed()
中调用
getFragmentManager().popBackStack()
。 当堆栈为空时,调用
super.onBackPressed()
,它没有任何内容,因此应用程序将直接退出

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

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

后台由Android自动管理。你不需要做任何特殊的事情来使用它。你想做什么?我想使用Backback navigation ie。当我在像
TextViewFragment
这样的内部片段上时,我按下后退按钮,它应该转到上一个片段ie.
RecycleServicewFragment
,但它会退出应用程序。删除你被覆盖的OnBackPressed,然后它就会工作。当你将super.onBackPressed作为第一个动作+popbackbackback作为第二个动作时,你基本上是在做两个backsteps,我想这就是为什么你的应用程序会关闭的原因。删除所有你自己的backbackback处理,它就会工作。在删除
onBackPressed
时,应用程序直接退出,甚至不刷新以前的片段。顺便说一句,我已经使用API 22进行编译,如果这很重要,并在API 21上运行应用程序,它可以在MainActivity中直接使用简单片段,但在我的例子中,顺序是我在问题中所说的,它不是那样工作的。我想导航抽屉可能制造了一些问题,我想现在我明白了。碎片里面的碎片。。。你查过儿童碎片管理器了吗?我没有在片段中使用片段。。我将用一个新的片段替换当前片段。对不起,我以前不清楚。所以我想我不需要使用
getChildFragmentManager()
好吧,如果你不使用fragment-in-fragment。。。。那么我的代码应该正是您所需要的,用另一个片段替换一个片段。也许可以进一步澄清一下您的布局,对我来说,看起来您正在加载NavigationDrawerFragment,然后将其替换为RecycleServicewFragment。这就是我的代码所做的,用另一个片段替换一个片段。确保只在需要的地方添加BackStack。我在问题中添加了一些图像,请检查,你会知道我正在尝试做什么。是的,关于super.onbackpress的问题,我在两小时前的第一篇评论中写道。。。不过,您现在所做的实际上是复制了super.onBackPressed的行为,因为活动中的原始实现与您现在使用自己的代码所做的完全相同。如果您不希望出现这种行为,您实际上会覆盖super.onBackPressed。@ElDuderino检查我的更新答案。它准确地解释了发生了什么
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;

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