ActionBarDrawerToggle与DrawerLayout

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动作条 绑定正确的交互。
04mDrawerToggle = 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    }

ActionBarDrawerToggle 的作用:

  • 改变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绑定切换器监听
2mDrawerLayout.setDrawerListener(mDrawerToggle);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值