Android棒棒糖工具栏在打开/关闭抽屉和后退按钮之间切换 [英] Android lollipop toolbar switch between open/close drawer and back button
问题描述
我有标准的导航抽屉,但现在我正在尝试使用工具栏对其进行修改.
之前我的代码如下所示:MainActivity.java
@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);Log.v("MAIN", "CREATE");初始化视图();setListeners();getFragmentManager().addOnBackStackChangedListener(new FragmentManager.OnBackStackChangedListener() {@覆盖公共无效 onBackStackChanged() {应该DisplayHomeUp();}});mNavigationDrawerFragment = (NavigationDrawerFragment)getFragmentManager().findFragmentById(R.id.navigation_drawer);mTitle = getTitle();//设置抽屉.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 = 抽屉布局;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) {@覆盖公共无效onDrawerClosed(查看drawerView){super.onDrawerClosed(drawerView);如果(!isAdded()){返回;}getActivity().invalidateOptionsMenu();//调用 onPrepareOptionsMenu()}@覆盖公共无效onDrawerOpened(查看drawerView){super.onDrawerOpened(drawerView);如果(!isAdded()){返回;}如果(!mUserLearnedDrawer){//用户手动打开抽屉;存储此标志以防止自动显示//将来会自动导航抽屉.mUserLearnedDrawer = true;SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(getActivity());sp.edit().putBoolean(PREF_USER_LEARNED_DRAWER, true).apply();}if (mDrawerListView != null) {}getActivity().invalidateOptionsMenu();//调用 onPrepareOptionsMenu()}@覆盖公共无效onDrawerSlide(查看drawerView,浮动slideOffset){super.onDrawerSlide(drawerView, slideOffset);}};//如果用户还没有了解"抽屉,打开它以将他们介绍给抽屉,//根据抽屉式导航设计指南.if (!mUserLearnedDrawer && !mFromSavedInstanceState) {mDrawerLayout.openDrawer(mFragmentContainerView);}//延迟代码依赖于先前实例状态的恢复.mDrawerToggle.setDrawerIndicatorEnabled(true);mDrawerLayout.post(new Runnable() {@覆盖公共无效运行(){mDrawerToggle.syncState();}});mDrawerLayout.setDrawerListener(mDrawerToggle);}
现在我修改了我的代码:MainActivity.java
@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);mToolbar = (工具栏) findViewById(R.id.toolbar);if (mToolbar != null) {setSupportActionBar(mToolbar);getSupportActionBar().setDisplayHomeAsUpEnabled(true);}初始化视图();setListeners();mNavigationDrawerFragment = (NavigationDrawerFragment)getFragmentManager().findFragmentById(R.id.navigation_drawer);mTitle = getTitle();//设置抽屉.mNavigationDrawerFragment.setUp(R.id.navigation_drawer,(DrawerLayout) findViewById(R.id.drawer_layout));应该DisplayHomeUp();getFragmentManager().addOnBackStackChangedListener(new FragmentManager.OnBackStackChangedListener() {@覆盖公共无效 onBackStackChanged() {mBackCount++;应该DisplayHomeUp();}});}
NavigationDrawerFragment.java
public void setUp(int fragmentId, DrawerLayout drawerLayout) {mFragmentContainerView = getActivity().findViewById(fragmentId);mDrawerLayout = 抽屉布局;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) {@覆盖公共无效onDrawerClosed(查看drawerView){super.onDrawerClosed(drawerView);如果(!isAdded()){返回;}getActivity().invalidateOptionsMenu();//调用 onPrepareOptionsMenu()}@覆盖公共无效onDrawerOpened(查看drawerView){super.onDrawerOpened(drawerView);如果(!isAdded()){返回;}如果(!mUserLearnedDrawer){//用户手动打开抽屉;存储此标志以防止自动显示//将来会自动导航抽屉.mUserLearnedDrawer = true;SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(getActivity());sp.edit().putBoolean(PREF_USER_LEARNED_DRAWER, true).apply();}if (mDrawerListView != null) {}getActivity().invalidateOptionsMenu();//调用 onPrepareOptionsMenu()}@覆盖公共无效onDrawerSlide(查看drawerView,浮动slideOffset){super.onDrawerSlide(drawerView, slideOffset);}};//如果用户还没有了解"抽屉,打开它以将他们介绍给抽屉,//根据抽屉式导航设计指南.if (!mUserLearnedDrawer && !mFromSavedInstanceState) {mDrawerLayout.openDrawer(mFragmentContainerView);}//延迟代码依赖于先前实例状态的恢复.mDrawerToggle.setDrawerIndicatorEnabled(true);mDrawerLayout.post(new Runnable() {@覆盖公共无效运行(){mDrawerToggle.syncState();}});mDrawerLayout.setDrawerListener(mDrawerToggle);}
以及shouldDisplayHomeUp功能:
public void shouldDisplayHomeUp (){boolean canBack = getFragmentManager().getBackStackEntryCount() >0;mNavigationDrawerFragment.getDrawerToggle().setDrawerIndicatorEnabled(!canBack);}
但是没有显示后退箭头
我试过打电话
getSupportActionBar().setDisplayHomeAsUpEnabled(canBack);getSupportActionBar().setHomeButtonEnabled(canBack);
所以后退箭头出现,但点击它没有效果
来自文档:
<块引用>要允许使用操作栏中的应用图标向上导航,请调用setDisplayHomeAsUpEnabled():
@Override public void onCreate(Bundle savedInstanceState) {...getActionBar().setDisplayHomeAsUpEnabled(true);}
<块引用>
这会在应用图标旁边添加一个左侧插入符号并将其作为操作启用按钮,这样当用户按下它时,您的活动会收到一个调用 onOptionsItemSelected().该操作的 ID 是android.R.id.home.
这意味着您必须在 onOptionsItemSelected
上实现您的后台例程并检查 R.id.home
.为了避免在单击汉堡菜单时调用例程,请在 onOptionsItemSelected
上检查 canback
.
http://developer.android.com/training/implementing-导航/ancestral.html#up
编辑
要归档您想要的内容,您必须实现自己的导航例程.
mToolbar.setNavigationOnClickListener(new View.OnClickListener() {@覆盖公共无效 onClick(查看 v){如果(应该返回()){//调用onbackpressed什么的如果(重新显示)返回;//之后返回,这样你就不会调用syncState();}else if (mNavigationDrawerFragment.isDrawerOpen())mNavigationDrawerFragment.closeDrawer();别的mNavigationDrawerFragment.openDrawer();mNavigationDrawerFragment.getActionBarDrawerToggle().syncState();}});}
要启用后退按钮图标只需调用 getSupportActionBar().setDisplayHomeAsUpEnabled(true);
禁用它只需调用 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屋!