• ActionBarDrawerToggle的简要介绍

    NavigationDrawer辅助
    服务器君一共花费 17.356 ms 进行了 2 次数据库查询,努力地为您提供了这个页面。
    广告很萌的

    ActionBarDrawerToggle 是 DrawerLayout.DrawerListener 实现。和 NavigationDrawer 搭配使用,推荐用这个方法,符合Android design规范。

    我们先来看看 NavigationDrawer 里面的 ActionBarDrawerToggle 是如何编写的。

    // ActionBarDrawerToggle ties together the the proper interactions
    // between the navigation drawer and the action bar app icon.
    // 动作条抽屉切换器 将 抽屉 与 app icon动作条 绑定正确的交互。
    mDrawerToggle = new ActionBarDrawerToggle(
    		getActivity(),                    /* host Activity */
    		mDrawerLayout,                    /* DrawerLayout object */
    		R.drawable.ic_drawer,             /* nav drawer image to replace 'Up' caret */
    		R.string.navigation_drawer_open,  /* "open drawer" description for accessibility */
    		R.string.navigation_drawer_close  /* "close drawer" description for accessibility */
    ) {
    	@Override
    	// 当抽屉关闭时
    	public void onDrawerClosed(View drawerView) {
    		super.onDrawerClosed(drawerView);
    		// 如果该Fragment对象没有被添加到了drawerView中
    		if (!isAdded()) {
    			return;
    		}
    		// 系统调用onPrepareOptionsMenu()去 update menu 
    		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();
    		}
    
    		getActivity().invalidateOptionsMenu(); // calls onPrepareOptionsMenu()
    	}
    

    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切换不重新实例化。

    最后不要忘了

    // 给抽屉Layout绑定切换器监听
    mDrawerLayout.setDrawerListener(mDrawerToggle);
    
更多 推荐条目

Welcome to NowaMagic Academy!

现代魔法 推荐于 2013-02-27 10:23   

本章最新发布
随机专题
  1. [PHP程序设计] PHP与Stream流 5 个条目
  2. [移动开发] Android View注入框架Butter Knife 3 个条目
  3. [软件工程与项目管理] 浏览器与CSS渲染技巧 2 个条目
  4. [计算机算法] 两数交换的各种算法细节 2 个条目
  5. [Linux操作系统] 基本 Linux Shell 命令 2 个条目
  6. [数据库技术] 数据库范式篇 5 个条目
  7. [智力开发与知识管理] 超越整体性学习 5 个条目
  8. [移动开发] Android 网络通信框架Volley 1 个条目
  9. [PHP程序设计] 声明式编程范式 12 个条目
  10. [PHP程序设计] PHP里的布尔类型 3 个条目
  11. [计算机算法] TAOCP与算法 12 个条目
  12. [数据结构] 散列表(哈希表) 13 个条目
窗口 -- [博客]