开/关抽屉和后退按钮之间的Android棒棒糖工具栏开关 [英] Android lollipop toolbar switch between open/close drawer and back button
问题描述
我有非标准的导航抽屉里,但现在我试图修改它,使用工具栏。
此前我的code样子: MainActivity.java
@覆盖
保护无效的onCreate(包savedInstanceState){
super.onCreate(savedInstanceState);
的setContentView(R.layout.activity_main);
Log.v(主,创建);
initViews();
setListeners();
getFragmentManager()。addOnBackStackChangedListener(新FragmentManager.OnBackStackChangedListener(){
@覆盖
公共无效onBackStackChanged(){
shouldDisplayHomeUp();
}
});
mNavigationDrawerFragment =(NavigationDrawerFragment)
。getFragmentManager()findFragmentById(R.id.navigation_drawer);
mTitle =的getTitle();
//设置抽屉。
mNavigationDrawerFragment.setUp(
R.id.navigation_drawer,
(DrawerLayout)findViewById(R.id.drawer_layout));
}
NavigationDrawerFragment.java
公共无效设置(INT fragmentId,DrawerLayout drawerLayout){
mFragmentContainerView = getActivity()findViewById(fragmentId)。
mDrawerLayout = drawerLayout;
mDrawerLayout.setDrawerShadow(R.drawable.drawer_shadow,GravityCompat.START);
((MainActivity)getActivity())getSupportActionBar()setDisplayHomeAsUpEnabled(真)。;
((MainActivity)getActivity())getSupportActionBar()setHomeButtonEnabled(真)。;
mDrawerToggle =新ActionBarDrawerToggle(getActivity(),mDrawerLayout,
((MainActivity)getActivity())。getToolbar(),
R.string.navigation_drawer_open,
R.string.navigation_drawer_close){
@覆盖
公共无效onDrawerClosed(查看drawerView){
super.onDrawerClosed(drawerView);
如果(!isAdded()){
返回;
}
。getActivity()invalidateOptionsMenu();在prepareOptionsMenu //调用()
}
@覆盖
公共无效onDrawerOpened(查看drawerView){
super.onDrawerOpened(drawerView);
如果(!isAdded()){
返回;
}
如果(!mUserLearnedDrawer){
//用户手动打开抽屉;该标志存储prevent自动显示
//在未来导航自动抽屉。
mUserLearnedDrawer = TRUE;
共享preferences SP = preferenceManager
.getDefaultShared preferences(getActivity());
。sp.edit()putBoolean(preF_USER_LEARNED_DRAWER,真)。适用();
}
如果(mDrawerListView!= NULL){
}
。getActivity()invalidateOptionsMenu();在prepareOptionsMenu //调用()
}
@覆盖
公共无效onDrawerSlide(查看drawerView,浮slideOffset){
super.onDrawerSlide(drawerView,slideOffset);
}
};
//如果用户没有学习关于抽屉,打开它,给他们介绍的抽屉里,
//每导航抽屉式设计的指导方针。
如果(mUserLearnedDrawer&安培;!&安培;!mFromSavedInstanceState){
mDrawerLayout.openDrawer(mFragmentContainerView);
}
//推迟code依赖于恢复previous实例状态。
mDrawerToggle.setDrawerIndicatorEnabled(真正的);
mDrawerLayout.post(新的Runnable(){
@覆盖
公共无效的run(){
mDrawerToggle.syncState();
}
});
mDrawerLayout.setDrawerListener(mDrawerToggle);
}
现在我修改了code: MainActivity.java
@覆盖
保护无效的onCreate(包savedInstanceState){
super.onCreate(savedInstanceState);
的setContentView(R.layout.activity_main);
mToolbar =(工具栏)findViewById(R.id.toolbar);
如果(mToolbar!= NULL){
setSupportActionBar(mToolbar);
getSupportActionBar()setDisplayHomeAsUpEnabled(真)。
}
initViews();
setListeners();
mNavigationDrawerFragment =(NavigationDrawerFragment)
。getFragmentManager()findFragmentById(R.id.navigation_drawer);
mTitle =的getTitle();
//设置抽屉。
mNavigationDrawerFragment.setUp(
R.id.navigation_drawer,
(DrawerLayout)findViewById(R.id.drawer_layout));
shouldDisplayHomeUp();
getFragmentManager()。addOnBackStackChangedListener(新FragmentManager.OnBackStackChangedListener(){
@覆盖
公共无效onBackStackChanged(){
mBackCount ++;
shouldDisplayHomeUp();
}
});
}
NavigationDrawerFragment.java
公共无效设置(INT fragmentId,DrawerLayout drawerLayout){
mFragmentContainerView = getActivity()findViewById(fragmentId)。
mDrawerLayout = drawerLayout;
mDrawerLayout.setDrawerShadow(R.drawable.drawer_shadow,GravityCompat.START);
mDrawerToggle =新ActionBarDrawerToggle(getActivity(),mDrawerLayout,
((MainActivity)getActivity())。getToolbar(),
R.string.navigation_drawer_open,
R.string.navigation_drawer_close){
@覆盖
公共无效onDrawerClosed(查看drawerView){
super.onDrawerClosed(drawerView);
如果(!isAdded()){
返回;
}
。getActivity()invalidateOptionsMenu();在prepareOptionsMenu //调用()
}
@覆盖
公共无效onDrawerOpened(查看drawerView){
super.onDrawerOpened(drawerView);
如果(!isAdded()){
返回;
}
如果(!mUserLearnedDrawer){
//用户手动打开抽屉;该标志存储prevent自动显示
//在未来导航自动抽屉。
mUserLearnedDrawer = TRUE;
共享preferences SP = preferenceManager
.getDefaultShared preferences(getActivity());
。sp.edit()putBoolean(preF_USER_LEARNED_DRAWER,真)。适用();
}
如果(mDrawerListView!= NULL){
}
。getActivity()invalidateOptionsMenu();在prepareOptionsMenu //调用()
}
@覆盖
公共无效onDrawerSlide(查看drawerView,浮slideOffset){
super.onDrawerSlide(drawerView,slideOffset);
}
};
//如果用户没有学习关于抽屉,打开它,给他们介绍的抽屉里,
//每导航抽屉式设计的指导方针。
如果(mUserLearnedDrawer&安培;!&安培;!mFromSavedInstanceState){
mDrawerLayout.openDrawer(mFragmentContainerView);
}
//推迟code依赖于恢复previous实例状态。
mDrawerToggle.setDrawerIndicatorEnabled(真正的);
mDrawerLayout.post(新的Runnable(){
@覆盖
公共无效的run(){
mDrawerToggle.syncState();
}
});
mDrawerLayout.setDrawerListener(mDrawerToggle);
}
和 shouldDisplayHomeUp 功能:
公共无效shouldDisplayHomeUp(){
布尔canBack = getFragmentManager()getBackStackEntryCount()> 0;
mNavigationDrawerFragment.getDrawerToggle()setDrawerIndicatorEnabled。(canBack!);
}
但后退箭头不显示
我试图调用
getSupportActionBar()setDisplayHomeAsUpEnabled(canBack)。
getSupportActionBar()setHomeButtonEnabled(canBack)。
于是后退箭头appers但点击它没有任何效果
从文档:
要允许向上导航与操作栏中的应用程序图标,通话 setDisplayHomeAsUpEnabled():
@覆盖公共无效的onCreate(包savedInstanceState){
...
getActionBar()setDisplayHomeAsUpEnabled(真)。 }
这增加了一个向左的插入符号旁边的应用程序图标,它能够作为一个行动 按钮,使得当用户presses它,你的活动接收 来电onOptionsItemSelected()。在操作中的ID android.R.id.home。
这意味着你将不得不执行你的背部程序上<code> onOptionsItemSelected 和检查 R.id.home
。为了避免调用程序,当你点击汉堡包菜单检查 canback
太上 onOptionsItemSelected
。
<一个href="http://developer.android.com/training/implementing-navigation/ancestral.html#up">http://developer.android.com/training/implementing-navigation/ancestral.html#up
修改
要archieve你想你将不得不实现自己的导航程序是什么。
mToolbar.setNavigationOnClickListener(新View.OnClickListener(){
@覆盖
公共无效的onClick(视图v){
如果(shouldBack()){
//调用onback pressed什么
如果(displayBackAgain)
返回;经过这么你不叫syncState //返回();
}否则,如果(mNavigationDrawerFragment.isDrawerOpen())
mNavigationDrawerFragment.closeDrawer();
其他
mNavigationDrawerFragment.openDrawer();
。mNavigationDrawerFragment.getActionBarDrawerToggle()syncState();
}
});
}
要启用后退按钮图标,只需拨打 getSupportActionBar()setDisplayHomeAsUpEnabled(真);
来禁用它就叫 mNavigationDrawerFragment.getActionBarDrawerToggle()syncState。 ();
I had standart navigation drawer, but now i'm trying to modify it, using toolbar.
Earlier my code looked like: MainActivity.java
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.v("MAIN", "CREATE");
initViews();
setListeners();
getFragmentManager().addOnBackStackChangedListener(new FragmentManager.OnBackStackChangedListener() {
@Override
public void onBackStackChanged() {
shouldDisplayHomeUp();
}
});
mNavigationDrawerFragment = (NavigationDrawerFragment)
getFragmentManager().findFragmentById(R.id.navigation_drawer);
mTitle = getTitle();
// Set up the drawer.
mNavigationDrawerFragment.setUp(
R.id.navigation_drawer,
(DrawerLayout) findViewById(R.id.drawer_layout));
}
NavigationDrawerFragment.java
public void setUp(int fragmentId, DrawerLayout drawerLayout) {
mFragmentContainerView = getActivity().findViewById(fragmentId);
mDrawerLayout = drawerLayout;
mDrawerLayout.setDrawerShadow(R.drawable.drawer_shadow, GravityCompat.START);
((MainActivity) getActivity()).getSupportActionBar().setDisplayHomeAsUpEnabled(true);
((MainActivity) getActivity()).getSupportActionBar().setHomeButtonEnabled(true);
mDrawerToggle = new ActionBarDrawerToggle(getActivity(), mDrawerLayout,
((MainActivity) getActivity()).getToolbar(),
R.string.navigation_drawer_open,
R.string.navigation_drawer_close) {
@Override
public void onDrawerClosed(View drawerView) {
super.onDrawerClosed(drawerView);
if (!isAdded()) {
return;
}
getActivity().invalidateOptionsMenu(); // calls onPrepareOptionsMenu()
}
@Override
public void onDrawerOpened(View drawerView) {
super.onDrawerOpened(drawerView);
if (!isAdded()) {
return;
}
if (!mUserLearnedDrawer) {
// The user manually opened the drawer; store this flag to prevent auto-showing
// the navigation drawer automatically in the future.
mUserLearnedDrawer = true;
SharedPreferences sp = PreferenceManager
.getDefaultSharedPreferences(getActivity());
sp.edit().putBoolean(PREF_USER_LEARNED_DRAWER, true).apply();
}
if (mDrawerListView != null) {
}
getActivity().invalidateOptionsMenu(); // calls onPrepareOptionsMenu()
}
@Override
public void onDrawerSlide(View drawerView, float slideOffset) {
super.onDrawerSlide(drawerView, slideOffset);
}
};
// If the user hasn't 'learned' about the drawer, open it to introduce them to the drawer,
// per the navigation drawer design guidelines.
if (!mUserLearnedDrawer && !mFromSavedInstanceState) {
mDrawerLayout.openDrawer(mFragmentContainerView);
}
// Defer code dependent on restoration of previous instance state.
mDrawerToggle.setDrawerIndicatorEnabled(true);
mDrawerLayout.post(new Runnable() {
@Override
public void run() {
mDrawerToggle.syncState();
}
});
mDrawerLayout.setDrawerListener(mDrawerToggle);
}
Now i modified my code: MainActivity.java
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mToolbar = (Toolbar) findViewById(R.id.toolbar);
if (mToolbar != null) {
setSupportActionBar(mToolbar);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
}
initViews();
setListeners();
mNavigationDrawerFragment = (NavigationDrawerFragment)
getFragmentManager().findFragmentById(R.id.navigation_drawer);
mTitle = getTitle();
// Set up the drawer.
mNavigationDrawerFragment.setUp(
R.id.navigation_drawer,
(DrawerLayout) findViewById(R.id.drawer_layout));
shouldDisplayHomeUp();
getFragmentManager().addOnBackStackChangedListener(new FragmentManager.OnBackStackChangedListener() {
@Override
public void onBackStackChanged() {
mBackCount++;
shouldDisplayHomeUp();
}
});
}
NavigationDrawerFragment.java
public void setUp(int fragmentId, DrawerLayout drawerLayout) {
mFragmentContainerView = getActivity().findViewById(fragmentId);
mDrawerLayout = drawerLayout;
mDrawerLayout.setDrawerShadow(R.drawable.drawer_shadow, GravityCompat.START);
mDrawerToggle = new ActionBarDrawerToggle(getActivity(), mDrawerLayout,
((MainActivity) getActivity()).getToolbar(),
R.string.navigation_drawer_open,
R.string.navigation_drawer_close) {
@Override
public void onDrawerClosed(View drawerView) {
super.onDrawerClosed(drawerView);
if (!isAdded()) {
return;
}
getActivity().invalidateOptionsMenu(); // calls onPrepareOptionsMenu()
}
@Override
public void onDrawerOpened(View drawerView) {
super.onDrawerOpened(drawerView);
if (!isAdded()) {
return;
}
if (!mUserLearnedDrawer) {
// The user manually opened the drawer; store this flag to prevent auto-showing
// the navigation drawer automatically in the future.
mUserLearnedDrawer = true;
SharedPreferences sp = PreferenceManager
.getDefaultSharedPreferences(getActivity());
sp.edit().putBoolean(PREF_USER_LEARNED_DRAWER, true).apply();
}
if (mDrawerListView != null) {
}
getActivity().invalidateOptionsMenu(); // calls onPrepareOptionsMenu()
}
@Override
public void onDrawerSlide(View drawerView, float slideOffset) {
super.onDrawerSlide(drawerView, slideOffset);
}
};
// If the user hasn't 'learned' about the drawer, open it to introduce them to the drawer,
// per the navigation drawer design guidelines.
if (!mUserLearnedDrawer && !mFromSavedInstanceState) {
mDrawerLayout.openDrawer(mFragmentContainerView);
}
// Defer code dependent on restoration of previous instance state.
mDrawerToggle.setDrawerIndicatorEnabled(true);
mDrawerLayout.post(new Runnable() {
@Override
public void run() {
mDrawerToggle.syncState();
}
});
mDrawerLayout.setDrawerListener(mDrawerToggle);
}
And shouldDisplayHomeUp function:
public void shouldDisplayHomeUp (){
boolean canBack = getFragmentManager().getBackStackEntryCount() > 0;
mNavigationDrawerFragment.getDrawerToggle().setDrawerIndicatorEnabled(!canBack);
}
But the back arrow is not shown
I tried call
getSupportActionBar().setDisplayHomeAsUpEnabled(canBack);
getSupportActionBar().setHomeButtonEnabled(canBack);
So the back arrow appers but clicking on it has no effect
From the docs:
To allow Up navigation with the app icon in the action bar, call setDisplayHomeAsUpEnabled():
@Override public void onCreate(Bundle savedInstanceState) {
...
getActionBar().setDisplayHomeAsUpEnabled(true); }
This adds a left-facing caret alongside the app icon and enables it as an action button such that when the user presses it, your activity receives a call to onOptionsItemSelected(). The ID for the action is android.R.id.home.
This means that you will have to implement your back routine on onOptionsItemSelected
and check for R.id.home
. To avoid calling the routine when you click on the hamburger menu check for canback
too on onOptionsItemSelected
.
http://developer.android.com/training/implementing-navigation/ancestral.html#up
EDIT
To archieve what you want you will have to implement your own navigation routine.
mToolbar.setNavigationOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(shouldBack()) {
//call onbackpressed or something
if(displayBackAgain)
return; //return after so you don't call syncState();
}else if (mNavigationDrawerFragment.isDrawerOpen())
mNavigationDrawerFragment.closeDrawer();
else
mNavigationDrawerFragment.openDrawer();
mNavigationDrawerFragment.getActionBarDrawerToggle().syncState();
}
});
}
To enable the backbutton icon just call getSupportActionBar().setDisplayHomeAsUpEnabled(true);
to disable it just call mNavigationDrawerFragment.getActionBarDrawerToggle().syncState();
这篇关于开/关抽屉和后退按钮之间的Android棒棒糖工具栏开关的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!