Android 在非运行时打开片段时,不显示向上导航

Android 在非运行时打开片段时,不显示向上导航,android,android-actionbar,navigation-drawer,android-navigation,up-navigation,Android,Android Actionbar,Navigation Drawer,Android Navigation,Up Navigation,该应用程序由1个活动和一个导航抽屉组成,我们还可以在2级层次结构中打开片段s。在后一种情况下,我们在操作栏上有一个后退按钮,以实现向上导航。 如果我们通过单击事件打开2级层次结构中的片段,那么在运行时一切都可以正常工作,但是当我们从代码中执行相同的操作时(使用相同的代码),导航按钮将不会显示。导航仍然有效。如果我们导航回主级,则会显示导航栏的汉堡图标,如果我们通过单击事件打开2级层次结构中的片段,则会显示后退按钮,而不是汉堡图标。 简言之:如果我们回到主页,一切都会恢复正常 相关方法: priv

该应用程序由1个
活动
和一个
导航抽屉
组成,我们还可以在2级层次结构中打开
片段
s。在后一种情况下,我们在
操作栏上有一个
后退按钮
,以实现向上导航。
如果我们通过单击事件打开2级层次结构中的片段,那么在运行时一切都可以正常工作,但是当我们从代码中执行相同的操作时(使用相同的代码),导航按钮将不会显示。导航仍然有效。如果我们导航回主级,则会显示
导航栏的汉堡图标,如果我们通过单击事件打开2级层次结构中的
片段,则会显示后退按钮,而不是汉堡图标。
简言之:如果我们回到主页,一切都会恢复正常

相关方法:

private void shouldDisplayHomeAsUp() {
  FragmentManager fragmentManager = getSupportFragmentManager();
  boolean shouldDisplay = fragmentManager.getBackStackEntryCount()>0;
  ActionBar actionBar = getSupportActionBar();
  if (actionBar != null) {
    actionBar.setDisplayHomeAsUpEnabled(shouldDisplay);
    CharSequence actionBarTitle = actionBar.getTitle();
    if (isMainListFragment(shouldDisplay, actionBarTitle)) {
      actionBar.setTitle(R.string.app_name);
      setDrawerEnabled(true);
    }
  }
}

private void setDrawerEnabled(boolean enabled) {
  if (!enabled) {
    disableDrawer();
    enableActionBarBackNavigation();
  } else {
    enableDrawer();
  }
}

private void disableDrawer() {
  drawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED);
  actionBarDrawerToggle.setDrawerIndicatorEnabled(false);
  actionBarDrawerToggle.syncState();
}

private void enableDrawer() {
  drawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_UNLOCKED);
  actionBarDrawerToggle.setDrawerIndicatorEnabled(true);
  actionBarDrawerToggle.syncState();
}

private void enableActionBarBackNavigation() {
  actionBarDrawerToggle.setToolbarNavigationClickListener(new View.OnClickListener() {

    @Override
    public void onClick(View view) {
      onBackPressed();
    }

  });
}
应该显示由
onbackbackchanged()
调用的homeAsup()
方法,但是当我们以静态方式调用它时,没有区别。
我们通常调用
actionBar.setDisplayHomeAsUpEnabled()
actionBarDrawerToggle.setDrawerIndicatorEnabled(false)
方法

见下图:

如果我们在应用程序中设置提醒,它将触发通知。当我们点击通知时,它会打开主屏幕-主页级别-,a列表-正如您在上面看到的-,然后是与todo相关的通知的详细视图。然后我们可以在视图层次结构中导航回去。这就是以编程方式打开片段的目的。

我解决了这个问题。
修改方法如下:

private void shouldDisplayHomeAsUp() {
  FragmentManager fragmentManager = getSupportFragmentManager();
  boolean shouldDisplay = fragmentManager.getBackStackEntryCount()>0;
  ActionBar actionBar = getSupportActionBar();
  if (actionBar != null) {
    if (shouldDisplay) {
      setDrawerEnabled(false);
      actionBar.setDisplayHomeAsUpEnabled(true);
    } else {
      actionBar.setDisplayHomeAsUpEnabled(false);
      setDrawerEnabled(true);
    }

    CharSequence actionBarTitle = actionBar.getTitle();
    if (isMainListFragment(shouldDisplay, actionBarTitle)) {
      actionBar.setTitle(R.string.app_name);
      actionBar.setDisplayHomeAsUpEnabled(false);
      setDrawerEnabled(true);
    }
  }
}
setDrawerEnabled(false)
actionBar.setDisplayHomeAsUpEnabled(true)
方法调用的顺序非常重要。这是问题的根本原因