ActionBarDrawerToggle与DrawerLayout
版权声明:本文为Ruiman博主原创文章,未经博主允许不得转载。
- Chapter: Android抽屉导航NavigationDrawer
ActionBarDrawerToggle 是 DrawerLayout.DrawerListener 实现。和 NavigationDrawer 搭配使用,推荐用这个方法,符合Android design规范。
我们先来看看 NavigationDrawer 里面的 ActionBarDrawerToggle 是如何编写的。
01 |
// ActionBarDrawerToggle ties together the the proper interactions |
02 |
// between the navigation drawer and the action bar app icon. |
03 |
// 动作条抽屉切换器 将 抽屉 与 app icon动作条 绑定正确的交互。 |
04 |
mDrawerToggle = new ActionBarDrawerToggle( |
05 |
getActivity(), /* host Activity */ |
06 |
mDrawerLayout, /* DrawerLayout object */ |
07 |
R.drawable.ic_drawer, /* nav drawer image to replace 'Up' caret */ |
08 |
R.string.navigation_drawer_open, /* "open drawer" description for accessibility */ |
09 |
R.string.navigation_drawer_close /* "close drawer" description for accessibility */ |
10 |
) { |
11 |
@Override |
12 |
// 当抽屉关闭时 |
13 |
public void onDrawerClosed(View drawerView) { |
14 |
super.onDrawerClosed(drawerView); |
15 |
// 如果该Fragment对象没有被添加到了drawerView中 |
16 |
if (!isAdded()) { |
17 |
return; |
18 |
} |
19 |
// 系统调用onPrepareOptionsMenu()去 update menu |
20 |
getActivity().invalidateOptionsMenu(); // calls onPrepareOptionsMenu() |
21 |
} |
22 |
23 |
@Override |
24 |
// 当抽屉打开时 |
25 |
public void onDrawerOpened(View drawerView) { |
26 |
super.onDrawerOpened(drawerView); |
27 |
if (!isAdded()) { |
28 |
return; |
29 |
} |
30 |
|
31 |
// 如果 变量“用户正在使用的抽屉” 没有设置 |
32 |
if (!mUserLearnedDrawer) { |
33 |
// The user manually opened the drawer; store this flag to prevent auto-showing |
34 |
// the navigation drawer automatically in the future. |
35 |
// 用户手动打开抽屉;存储该标志,以防止自动显示在后面的导航抽屉。 |
36 |
mUserLearnedDrawer = true; |
37 |
// 设置偏好 |
38 |
SharedPreferences sp = PreferenceManager |
39 |
.getDefaultSharedPreferences(getActivity()); |
40 |
sp.edit().putBoolean(PREF_USER_LEARNED_DRAWER, true).apply(); |
41 |
} |
42 |
43 |
getActivity().invalidateOptionsMenu(); // calls onPrepareOptionsMenu() |
44 |
} |
- 改变android.R.id.home返回图标。
- Drawer拉出、隐藏,带有android.R.id.home动画效果。
- 监听Drawer拉出、隐藏;
有几点解释一下:
1. getActivity().invalidateOptionsMenu(); 在运行时改变menu item的状态。你需要重写onPrepareOptionsMenu() ,它方便你对item移除,添加,使不可用等。在android 3.0以上,你必须调用invalidateOptionsMenu() 。
当你要update你的menu时,因为action bar是一直出现的。然后系统将调用onPrepareOptionsMenu()更改menu。
Activity与Fragment中都有关于menu的一系列的方法,并且都是自动的在框架中回调的。其中onCreateOptionsMenu()只是在创建menu时调用一次,但menu存在的时候是不会重复调用的。更新menu时,从activity中主动的调用 invalidateOptionsMenu() 方法,那么activity在显示menu之前自然会回调onPrepareOptionsMenu(Menu menu),再在该方法内实现更新的细节即可。
如果Fragment中没有invalidateOptionsMenu()方法,并且当menu存在的时候fragment也不会调用onCreateOptionsMenu()方法,那么我们可以在Fragment中直接调用setHasOptionsMenu()方法,将该方法设置为true,它就会调用onCreateOptionsMenu(),如此一来我们的目的就达到了。
2. isAdded();
public final boolean isAdded() 如果该Fragment对象被添加到了它的Activity中,那么它返回true,否则返回false。先判断 Fragment 是否 add,这样就能做到多个Fragment切换不重新实例化。
最后不要忘了
1 |
// 给抽屉Layout绑定切换器监听 |
2 |
mDrawerLayout.setDrawerListener(mDrawerToggle); |

浙公网安备 33010602011771号