整个示例都是改造自 Google Android Training 中的 NavigationDrawer 示例(http://developer.android.com/training/implementing-navigation/nav- drawer.html)

因为我需要使用自定义的 ActionBar,而ActionBarDrawerToggle 只能通过 ActionBar 中的 Action Menu 进行触发,且需要提供一个indicator图片,而不支持自定义按钮的触发(如下代码):

  1. public boolean onOptionsItemSelected(MenuItem item) {
  2. if (item != null && item.getItemId() == ID_HOME && mDrawerIndicatorEnabled) {
  3. if (mDrawerLayout.isDrawerVisible(GravityCompat.START)) {
  4. mDrawerLayout.closeDrawer(GravityCompat.START);
  5. } else {
  6. mDrawerLayout.openDrawer(GravityCompat.START);
  7. }
  8. return true;
  9. }
  10. return false;
  11. }

因此考虑参考 ActionBarDrawerToggle 重写自己的 MabDrawerToggle,然后去掉 onOptionsItemSelected 方式来触发 drawer,新增了一个 switchDrawer 方法,如下:

  1. public void switchDrawer()
  2. {
  3. if (mDrawerLayout.isDrawerVisible(GravityCompat.START))
  4. {
  5. mDrawerLayout.closeDrawer(GravityCompat.START);
  6. }
  7. else
  8. {
  9. mDrawerLayout.openDrawer(GravityCompat.START);
  10. }
  11. }

下面看一下 ActionBar 自定义 View 中标题居中的问题,折腾了好久,最后采用 FrameLayout 方式解决的,如下 action_bar_title.xml:

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:layout_width="fill_parent"
  4. android:layout_height="wrap_content">
  5. <TextView
  6. android:id="@android:id/title"
  7. android:layout_height="match_parent"
  8. android:layout_width="match_parent"
  9. android:gravity="center"
  10. android:text="hello"
  11. android:textColor="@android:color/holo_red_light"/>
  12. <ImageButton
  13. android:id="@+id/left_btn"
  14. android:layout_height="wrap_content"
  15. android:layout_width="wrap_content"
  16. android:layout_gravity="left|center_vertical"
  17. android:layout_marginLeft="12.0dip"
  18. android:src="@android:drawable/ic_media_play"/>
  19. <ImageButton
  20. android:id="@+id/right_btn"
  21. android:layout_height="wrap_content"
  22. android:layout_width="wrap_content"
  23. android:layout_gravity="right|center_vertical"
  24. android:layout_marginRight="12.0dip"
  25. android:src="@android:drawable/ic_media_pause"/>
  26. </FrameLayout>

在 onCreate 中实现如下:

  1. protected void onCreate(Bundle savedInstanceState)
  2. {
  3. super.onCreate(savedInstanceState);
  4. setContentView(R.layout.activity_main);
  5. mTitle = getTitle();
  6. mPlanetTitles = getResources().getStringArray(R.array.planets_array);
  7. mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
  8. mDrawerList = (ListView) findViewById(R.id.left_drawer);
  9. // set a custom shadow that overlays the main content when the drawer opens www.it165.net
  10. mDrawerLayout.setDrawerShadow(R.drawable.drawer_shadow, GravityCompat.START);
  11. mDrawerList.setAdapter(new ArrayAdapter<String>(this,
  12. R.layout.drawer_list_item, mPlanetTitles));
  13. mDrawerList.setOnItemClickListener(new DrawerItemClickListener());
  14. ActionBar.LayoutParams lp = new ActionBar.LayoutParams(
  15. ActionBar.LayoutParams.MATCH_PARENT,
  16. ActionBar.LayoutParams.MATCH_PARENT,
  17. Gravity.CENTER);
  18. View viewTitleBar = getLayoutInflater().inflate(R.layout.action_bar_title, null);
  19. getActionBar().setCustomView(viewTitleBar, lp);
  20. getActionBar().setDisplayShowHomeEnabled(false);
  21. getActionBar().setDisplayShowTitleEnabled(false);
  22. getActionBar().setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM);
  23. getActionBar().setDisplayShowCustomEnabled(true);
  24. tvTitle = (TextView) getActionBar().getCustomView().findViewById(android.R.id.title);
  25. ImageButton ibtnNav = (ImageButton) getActionBar().getCustomView().findViewById(R.id.left_btn);
  26. ibtnNav.setOnClickListener(new View.OnClickListener() {
  27. @Override
  28. public void onClick(View v) {
  29. mDrawerToggle.switchDrawer();
  30. }
  31. });
  32. // MabDrawerToggle ties together the the proper interactions
  33. // between the sliding drawer and the action bar app icon
  34. mDrawerToggle = new MabDrawerToggle(
  35. this, /* host Activity */
  36. mDrawerLayout, /* DrawerLayout object */
  37. R.drawable.ic_drawer, /* nav drawer image to replace 'Up' caret */
  38. R.string.drawer_open, /* "open drawer" description for accessibility */
  39. R.string.drawer_close /* "close drawer" description for accessibility */
  40. );
  41. mDrawerLayout.setDrawerListener(mDrawerToggle);
  42. if (savedInstanceState == null)
  43. {
  44. selectItem();
  45. }
  46. }

下面为两张运行效果图:

选择 Navigation 列表中的项后,切换 Fragment 以及 标题:

Android Navigation Drawer,自定义ActionBar(标题居中)的更多相关文章

  1. Android Navigation Drawer(导航抽屉)

    Google I/O 2013 Android 更新了Support库,新版本的Support库中新加入了几个比较重要的功能. 添加 DrawerLayout 控件,支持创建  Navigation ...

  2. 自定义ActionBar标题与菜单中的文字样式

    自定义标题文字样式 标题样式是ActionBar样式的一部分,所以要先定义ActionBar的样式 <style name="AppTheme" parent="A ...

  3. android nagative drawer图标跟标题适配

    <?xml version="1.0" encoding="utf-8"?> <resources> <string name=& ...

  4. 自定义actionbar标题

    这是我自己封装的一个activity,主要作为所有Activity的基类,可以一键关掉所有的activity, 并共享一个自定义actionbar.直接切入主题吧. 第一步就是创建自定义标题的布局文件 ...

  5. 自定义 ActionBar 标题与菜单中的文字样式

    自定义标题文字样式 标题样式是 ActionBar 样式的一部分,所以要先定义 ActionBar 的样式 <style name="AppTheme" parent=&qu ...

  6. Android - Navigation Drawer

    http://www.jianshu.com/p/c8cbeb7ea43a 用Navigation Drawer 和 Navigation View 来实现左右侧滑 Activity里甚至什么都不用写 ...

  7. 不使用setCustomView,设置ActionBar标题居中

    仅供参考,有太多自定义标题栏需求时,还是建议使用setCustomView https://blog.csdn.net/chiceT/article/details/50455358

  8. Android UI开发第三十二篇——Creating a Navigation Drawer

    Navigation Drawer是从屏幕的左侧滑出,显示应用导航的视图.官方是这样定义的: The navigation drawer is a panel that displays the ap ...

  9. Android UI开发第三十三篇——Navigation Drawer For Android API 7

    Creating a Navigation Drawer中使用的Navigation Drawer的android:minSdkVersion="14",现在Android API ...

随机推荐

  1. 系统架构师JD

    #################################################################################################### ...

  2. libcurl

    一.LibCurl基本编程框架 二.一些基本的函数 三.curl_easy_setopt函数部分选项介绍 四.curl_easy_perform 函数说明(error 状态码) 五.libcurl使用 ...

  3. 深度分析 Java 的 ClassLoader 机制(源码级别)

    写在前面:Java中的所有类,必须被装载到jvm中才能运行,这个装载工作是由jvm中的类装载器完成的,类装载器所做的工作实质是把类文件从硬盘读取到内存中,JVM在加载类的时候,都是通过ClassLoa ...

  4. Financial Management

    Financial Management 时间限制:3000 ms  |  内存限制:65535 KB 难度:1   描述 Larry graduated this year and finally ...

  5. JSTL标签总结

    一.JSTL简介: 1.JSP标准标签库JSTL(JSP Standard Tag Library)是一个JSP标签集合,它封装了JSP应用的通用核心功能. 2.JSTL支持通用的.结构化的任务.比如 ...

  6. ios显示艺术字字体颜色渐变

    UIColor * myColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"123.jpg"]]; self. ...

  7. windows android studio 编译Jni动态库

    项目需要,折腾了半天搞定windows android studio环境编译Jni动态库,现记录下来. 准备安装环境: 1. android studio 下载地址是http://www.androi ...

  8. ios开发之多线程资源争夺

    上一篇介绍了常用的多线程技术,目前开发中比较常用的是GCD,其它的熟悉即可.多线程是为了同步完成多项任务,不是为了提高运行效率,而是为了提高资源使用率来提高系统的整体性能,但是会出现多个线程对同一资源 ...

  9. 【WCF--初入江湖】01 WCF编程概述

    01 WCF编程概述 SOA的优点 1.服务独立于平台和工作环境.服务并不关心自己所处的环境,也不关心与之进行通信的服务所处的    环境. 2.服务相互隔离. 3.服务对协议.格式和传输中立. 4. ...

  10. Finite State Machine

    Contents [hide]  1 Description 2 Components 3 C# - FSMSystem.cs 4 Example Description This is a Dete ...