打开片段而不是在运行时时,导航不会出现

时间:2017-07-28 09:47:20

标签: android android-actionbar navigation-drawer android-navigation up-navigation

该应用程序由1 ActivityNavigationDrawer组成,我们也可以在2级层次结构中打开Fragment。在后一种情况下,Back Button上有ActionBar来实现导航 如果我们通过点击事件打开2级层次结构中的片段,那么在运行时一切正常,但是当我们从代码中执行相同操作时 - 也使用相同的代码 - 导航按钮不会显示。导航仍然有效。如果我们导航回到主级别,则显示NavigationBar的汉堡包图标,如果我们通过点击事件打开2级层次结构中的Fragment,则后退按钮显示尽管如此,而不是汉堡包图标 简而言之:如果我们回到家庭层面,一切都会正常运行。

相关方法:

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();
    }

  });
}

shouldDisplayHomeAsUp()调用的onBackStackChanged()方法,但是当我们以静态方式调用它时没有区别。
大多数情况下,我们称之为actionBar.setDisplayHomeAsUpEnabled()actionBarDrawerToggle.setDrawerIndicatorEnabled(false)方法。

见下图: left is the proper one

如果我们在应用程序中设置提醒,它将触发通知。当我们点击通知时,它会打开主屏幕 - 主页级别 - 列表 - 如上所示 - ,然后是通知相关待办事项的详细视图。然后我们可以在视图层次结构中导航回来。这是以编程方式打开片段的目的。

1 个答案:

答案 0 :(得分:1)

我解决了这个问题 修改了这样的方法:

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)方法调用的顺序非常重要。这是问题的根本原因。