不在运行时打开片段时,向上导航不出现
Up navigation not appearing, when opening Fragments not in runtime
该应用程序由 1 个 Activity
和一个 NavigationDrawer
组成,我们也可以在 2 级层次结构中打开 Fragment
。在后一种情况下,我们在 ActionBar
上有一个 Back Button
来实现向上导航。
如果我们通过单击事件打开 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)
方法。
见下图:
如果我们在应用中设置提醒,就会触发通知。当我们点击通知时,它会打开主屏幕 - 主页 - 列表 - 如您所见 - 然后是与待办事项相关的通知的详细视图。然后我们可以在视图层次结构中导航回来。这就是以编程方式打开片段的目的。
我解决了问题。
修改方法如下:
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)
方法调用的顺序非常重要。这就是问题的根本原因。
该应用程序由 1 个 Activity
和一个 NavigationDrawer
组成,我们也可以在 2 级层次结构中打开 Fragment
。在后一种情况下,我们在 ActionBar
上有一个 Back Button
来实现向上导航。
如果我们通过单击事件打开 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)
方法。
见下图:
如果我们在应用中设置提醒,就会触发通知。当我们点击通知时,它会打开主屏幕 - 主页 - 列表 - 如您所见 - 然后是与待办事项相关的通知的详细视图。然后我们可以在视图层次结构中导航回来。这就是以编程方式打开片段的目的。
我解决了问题。
修改方法如下:
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)
方法调用的顺序非常重要。这就是问题的根本原因。