导航DrawerLayout按钮永远不会更改为后退按钮,也不会导航

时间:2014-08-06 17:38:47

标签: android android-fragments navigation-drawer back-stack

每次用户点击抽屉菜单中的项目时,我都会使用DrawerLayout并添加新的Fragment。这非常有效。

在其中一个fragments中,用户可以导航到另一个片段:

private void loadArchives() {

    PUCNewsArchive news_archive = new PUCNewsArchive();

    getFragmentManager()
    .beginTransaction()
    .add(R.id.container_frame, news_archive, "news_archives")
    .addToBackStack(null)
    .commit();

}

这将正确地将另一个fragment添加到堆栈中。但是,它不会将操作栏抽屉按钮/图标更改为后退按钮。因此,在点击时再次打开抽屉,这是不应该做的。导航回来的唯一方法是使用硬件后退按钮,它返回到之前的fragment。我尝试将以下内容添加到我的主Activity以查看发生了什么:

@Override
public void onBackPressed(){
    FragmentManager fm = getFragmentManager();
    if (fm.getBackStackEntryCount() > 0) {
        Log.i("MainActivity", "popping backstack");
        fm.popBackStack();
    } else {
        Log.i("MainActivity", "nothing on backstack, calling super");
        super.onBackPressed();
    }
}

但是只有在我使用硬件后退按钮时才会调用它,因为抽屉按钮只打开抽屉。

我认为这应该检查它是否应该打开抽屉或导航:

@Override
public boolean onOptionsItemSelected(MenuItem item) {

    if (mDrawerToggle.onOptionsItemSelected(item)) {
        return true;
    }

    switch(item.getItemId()) {
    case android.R.id.home:

        return true;
    default:
        return super.onOptionsItemSelected(item);
    }

}

我错过了什么?为什么抽屉按钮永远不会改变为后退按钮,也不像一个按钮?

3 个答案:

答案 0 :(得分:2)

您无需使用onBackPressed()

我的应用中有一个非常similar situation。以下是我如何使用它:

我在主要活动中创建了一个方法:

public void foo(int fragment_id) {
        if(fragment_id == some_id){
            // keep the drawer carat
            mDrawerToggle.setDrawerIndicatorEnabled(true);
        }else{
            // Disable the  drawer carat, and enable the back button
            mDrawerToggle.setDrawerIndicatorEnabled(false);
            getActionBar().setDisplayHomeAsUpEnabled(true);
        }
    }

我从每个片段的onResume()调用此方法,并将其传递给特定的片段id。或者,您可以从主要活动中的loadFragment()/loadArchives()方法调用它。这对我来说很好。

答案 1 :(得分:0)

在导航活动中

此活动控制应用中的所有片段。

在准备新片段以替换其他片段时,我设置了DrawerToggle     setDrawerIndicatorEnabled(false)喜欢这样:

private void loadArchives() {

PUCNewsArchive news_archive = new PUCNewsArchive();

//disable the toggle menu and show up carat
theDrawerToggle.setDrawerIndicatorEnabled(false);

getFragmentManager()
.beginTransaction()
.add(R.id.container_frame, news_archive, "news_archives")
.addToBackStack(null)
.commit();
}

在onCreateview中的另一个片段

呼叫

// update the actionbar to show the up carat/affordance getActivity().getActionBar().setDisplayHomeAsUpEnabled(true);

更多参考Check This Question

答案 2 :(得分:0)

我尝试了以上建议的代码但是操作栏左侧的“向上”或“向后”箭头没有显示在我的应用中。但幸运的是,我能够解决这个问题。

简要代码:

将当前片段放入Back Stack时启动片段的函数:

Visual3D

打开或关闭“NavigationDrawer”的功能:

public void startFragment(){
    MyFrag myFrag = new MyFrag();

    getSupportFragmentManager()
        .beginTransaction()
        .replace(R.id.frag_container ,myFrag)
        .addToBackStack(null)
        .setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE)
        .commit();
}

我从Material.io下载了drawable:ic_keyboard_backspace_white_24dp

完整答案:

  

Disabling navigation drawer, toggling home-button/up-indicator in fragments