【问题标题】:Navigation DrawerLayout button never changes to back button and won't navigateNavigation DrawerLayout 按钮永远不会更改为后退按钮并且不会导航
【发布时间】:2014-08-06 17:38:46
【问题描述】:

每次用户从抽屉菜单中点击一个项目时,我都会使用 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);
    }

}

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

【问题讨论】:

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


【解决方案1】:

您不需要使用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() 方法调用它。这对我来说很好。

【讨论】:

  • 但是当我点击那个按钮时让它从堆栈中弹出当前片段呢?
  • 啊,是的。对不起,我忘了提。当你加载片段时,给它一个名字/id。当您按下返回按钮时,您可以拨打fm.popBackStack("name"/id, FragmentManager.POP_BACK_STACK_INCLUSIVE)
  • 每次点击后/抽屉图标时调用什么函数?
  • 就我而言,我在主要活动中有一个'主页. Whenever the user selects this item from the drawer, in my onOptionsItemSelected()`,我调用if (fm.getBackStackEntryCount() > 0) { fm.popBackStack(); }。因此,当用户返回主页时,它会清除整个堆栈。您可能可以使用类似的安排? (在我的应用中只有 2 个级别。所以我不需要按名称/ID 调用片段。)
  • 确实!当我实现这个时,我花了很多时间在 Android 文档 + StackOverflow.com 上。没有一个地方可以让我获得所有信息!它散落在各处。虽然我很高兴它现在对你有用!
【解决方案2】:

在您的导航活动中

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

在准备新片段替换其他片段时,我设置了 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

【讨论】:

  • 好的,这样在我想显示后退按钮时效果很好。但是当我点击那个按钮时让它从堆栈中弹出当前片段呢?
【解决方案3】:

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

简要代码:

将当前片段放入Back Stack时启动片段的功能:

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

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

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

public void setNavigationDrawerState(boolean isEnabled) {
if ( isEnabled ) {
    drawer.setDrawerLockMode(DrawerLayout.LOCK_MODE_UNLOCKED);
    toggle.setDrawerIndicatorEnabled(true);
    toggle.syncState();
}
else {
    drawer.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED);
    toggle.setDrawerIndicatorEnabled(false);
    toggle.setHomeAsUpIndicator(R.drawable.ic_keyboard_backspace_white_24dp);    

    toggle.syncState();
}

我从Material.io下载了drawable:ic_keyboard_backspace_white_24dp

完整答案:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-25
    • 2015-07-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多