Android 5.0工具栏片段回退

Android 5.0工具栏片段回退,android,android-fragments,android-5.0-lollipop,back-stack,android-toolbar,Android,Android Fragments,Android 5.0 Lollipop,Back Stack,Android Toolbar,我使用了appcompat库中的新工具栏来替换操作栏,并使用导航抽屉对其进行了设置 我的问题是,按back会最小化应用程序,而不是在Backback中循环。 如果我手动将逻辑添加到onBackPressed()以弹出后堆栈,这是一种解决方案,但会弄乱导航抽屉当前选定的项目 activity_main.xml <LinearLayout> <android.support.v7.widget.Toolbar/> <android.support.v

我使用了appcompat库中的新工具栏来替换操作栏,并使用导航抽屉对其进行了设置

我的问题是,按back会最小化应用程序,而不是在Backback中循环。 如果我手动将逻辑添加到
onBackPressed()
以弹出后堆栈,这是一种解决方案,但会弄乱导航抽屉当前选定的项目

activity_main.xml

<LinearLayout>

    <android.support.v7.widget.Toolbar/>

    <android.support.v4.widget.DrawerLayout>

        <FrameLayout
            android:id="@+id/container"
            android:layout_width="match_parent"
            android:layout_height="match_parent"/>

        <ListView android:id="@+id/navigation_drawer"/>

    </android.support.v4.widget.DrawerLayout>

</LinearLayout>

MainActivity.java

private void setupDrawerAndToolbar() {
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);

    final DrawerLayout drawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
    toggle = new ActionBarDrawerToggle(this, drawerLayout, toolbar,
        R.string.app_name, R.string.app_name);
    drawerLayout.setDrawerListener(toggle);

    drawerList.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            onNavigationDrawerItemSelected(position, true);
            drawerLayout.closeDrawer(GravityCompat.START);
        }
    });
    List<NavigationDrawerItem> items = new ArrayList<>();
    items.add(...);
    drawerList.setAdapter(new NavigationDrawerAdapter(this, items));
    drawerList.setItemChecked(selectedIndex, true);
}

...

private void onNavigationDrawerItemSelected(int position, boolean addToBackStack) {
    if (position == selectedIndex) {
        return;
    }
    selectedIndex = position;

    // update the main content by replacing fragments
    FragmentManager manager = getFragmentManager();

    Fragment fragment;

    switch (position) {
        case ...:
            fragment = new Fragment();
            break;
        default:
            throw new IllegalArgumentException("invalid position");
    }

    FragmentTransaction transaction =
        manager.beginTransaction()
               .replace(R.id.container, fragment);

    if (addToBackStack) {
        transaction.addToBackStack(fragment.getClass().getName());
    }

    transaction.commit();
}
private void设置工具条(){
Toolbar Toolbar=(Toolbar)findViewById(R.id.Toolbar);
设置支持操作栏(工具栏);
最终抽屉布局抽屉布局=(抽屉布局)findViewById(R.id.抽屉布局);
toggle=新操作BarDrawerToggle(此、抽屉布局、工具栏、,
R.string.app_name,R.string.app_name);
抽屉布局。SetDroperListener(切换);
DroperList.setOnItemClickListener(新的AdapterView.OnItemClickListener(){
@凌驾
public void onItemClick(AdapterView父对象、视图、整型位置、长id){
onNavigationDrawerItemSelected(位置,true);
抽屉布局。关闭抽屉(重力公司启动);
}
});
列表项=新建ArrayList();
增加(……);
setAdapter(新的导航抽屉指针(this,items));
抽屉列表。setItemChecked(selectedIndex,true);
}
...
已选择NavigationDrawerItemSelected上的私有void(int位置,布尔addToBackStack){
如果(位置==所选索引){
返回;
}
selectedIndex=位置;
//通过替换片段更新主要内容
FragmentManager=getFragmentManager();
片段;
开关(位置){
案例…:
fragment=新片段();
打破
违约:
抛出新的IllegalArgumentException(“无效位置”);
}
零碎交易=
经理:开始营业()
.更换(R.id.容器、碎片);
if(addToBackStack){
transaction.addToBackStack(fragment.getClass().getName());
}
commit();
}

想出了一个解决办法:

private void onNavigationDrawerItemSelected(int position, boolean addToBackStack) {
    if (position == selectedIndex) {
        return;
    }

    // update the main content by replacing fragments

    Fragment fragment;

    switch (position) {
        case ...:
            fragment = new Fragment();
            break;
        default:
            throw new IllegalArgumentException("invalid position");
    }

    FragmentTransaction transaction =
        getFragmentManager().beginTransaction()
                            .replace(R.id.container, fragment, fragment.getClass().getName());

    if (addToBackStack) {
        transaction.addToBackStack(String.valueOf(selectedIndex));
    }

    transaction.commit();
    selectedIndex = position;
}

...

@Override
public void onBackPressed() {
    int count = getFragmentManager().getBackStackEntryCount();
    if (count > 0) {
        int index = Integer.parseInt(
            getFragmentManager().getBackStackEntryAt(count - 1).getName());
        getFragmentManager().popBackStack();
        selectedIndex = index;
        return;
    }
    super.onBackPressed();
}