ActionBar的问题

Navigation View是Android Support Library中的一个新的组件,该组件提供类似于Sliding Menu的抽屉功能,在张兴业的博客中有讲解到具体的使用方法。作者用的貌似就是Google官方提供的例子,但是在使用过程中产生了不少的问题,主要原因是使用的编译环境不一样。

原文中,有这样一段代码:

getActionBar().setHomeButtonEnabled(true);
getActionBar().setDisplayHomeAsUpEnabled(true);

  而实际上,这种用法极有可能产生空指针异常。从Android3.0(API级别 11)开始,Action bar被包含在所有的使用Theme.Hole主题的Activity(或者是这些Activity的子类)中,当targetSdkVersion或minSdkVersion属性被设置为“11”或更大的数值是,这个主题是默认的主题。因此,在使用ActionBar的时候需要注意targetSdkVersion或minSdkVersion的值,避免因此产生空指针异常。

另外还有一个情况需要注意的是,我们在使用Android Studio新建项目时,Activity都是继承于AppCompatActivity类。这个时候,再使用getActionBar()来获取ActionBar都会得到null。事实上,当使用AppCompatActivity或其他support包中的基类时都会有这个问题。此时,要获得ActionBar实例需要用另一个相应的方法,那就是getSupportActionBar(),ActionBar也要使用相应support包下的。(参考

getSupportActionBar().setHomeButtonEnabled(true);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);

Android:Layout_gravity属性

在使用Navigation Drawer时,需要配合DrawerLayout布局管理器一起使用。第一个子组件一般是作为显示主区域内容之用,第二个和第三个子组件才是真正的Drawer布局。当然,如果只有一个Drawer的话,第三个组件就不需要了。如下:

 <?xml version="1.0" encoding="utf-8"?>
<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/drawer_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"> <FrameLayout
android:id="@+id/content_frame"
android:layout_width="match_parent"
android:layout_height="match_parent" /> <ListView
android:id="@+id/left_drawer"
android:layout_width="240dp"
android:layout_height="match_parent"
android:layout_gravity="start"
android:choiceMode="singleChoice"
android:divider="@android:color/transparent"
android:dividerHeight="0dp"
android:background="#fff" />
</android.support.v4.widget.DrawerLayout>

这里最重要的一个关键属性是android:layout_gravity,如果不设置这个属性,将会导致程序会奔溃。这里取值为start,是一种更通用的取值方法。因为Google考虑到各国使用习惯的不同,有的是从左至右(LR)的顺序,有的是从右至左(RL)的顺序。取值为Start则不具体指定开发的方向,而由系统去决定。这样应用将具备更好的适应性。

Android Studio的调试

Android Studio如今更新到2.0 preview3了,算是比较成熟了。在Github上翻看一些工程时,发现国外的开发者基本上都是用Android Studio来进行开发应用了。然而本人在开发时,有时还是怀念用ADT开发的时代。今天在调试程序时,在Android Studio中始终无法看到更具体的异常信息,只有简单的一句话:

12-13 18:23:56.620 12568-12568 W/dalvikvm: VFY: unable to resolve virtual method 433: Landroid/content/res/TypedArray;.getType (I)I
12-13 18:23:56.770 12568-12568 W/dalvikvm: threadid=1: thread exiting with uncaught exception (group=0x419f6c50)

此外,设备显示“抱歉,XXXX已停止运行”。那么就下几个断点来调试看看呗。Debugger走起来发现程序进到了系统底层才抛出异常,调试器也已经罢工。再想着把线程调用栈打开来看看有没有什么蛛丝马迹,然并卵。其实在Java层有异常的话,在Logcat应有异常信息才对,否则根本无法定位。

总结至此,还是有一些心得。程序出现奔溃有两个方面:Java代码的逻辑问题,XML资源文件的问题。Java代码在编写的时候尽量要捕获异常,对于后面的Bug调试非常有用,而XML资源文件通常是由于属性设置的不对导致的问题。

参考链接

  • http://wear.techbrood.com/design/patterns/navigation-drawer.html
  • http://blog.csdn.net/lincyang/article/details/46286895
  • http://programwith.com/question_364485_the-error-about-drawerlayoutillegalargumentexception-view-android-widget-relat
  • http://stackoverflow.com/questions/22742073/error-view-android-widget-listview-is-not-a-sliding-drawer/22742093

Navigation Drawer的使用及遇到的问题的更多相关文章

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

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

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

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

  3. Navigation Drawer介绍

    在2013 google IO当天,Android团的更新了Support库,新版本(V13)的Support库中新加入了几个比较重要的功能. 添加 DrawerLayout 控件,支持创建  Nav ...

  4. Navigation Drawer(导航抽屉)

    目录(?)[-] 创建一个导航抽屉 创建抽屉布局 初始化抽屉列表 处理导航项选点击事件 监听导航抽屉打开和关闭事件 点击应用图标来打开和关闭导航抽屉 创建一个导航抽屉 导航抽屉是一个位于屏幕左侧边缘用 ...

  5. Creating a Navigation Drawer 创建一个导航侧边栏

    The navigation drawer is a panel that displays the app’s main navigation options on the left edge of ...

  6. Android官方终于支持 Navigation Drawer(导航抽屉)模式

    在2013 google IO当天,Android团的更新了Support库,新版本(V13)的Support库中新加入了几个比较重要的功能. 添加 DrawerLayout 控件,支持创建  Nav ...

  7. Android Navigation Drawer(导航抽屉)

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

  8. Android - Navigation Drawer

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

  9. Android设计和开发系列第二篇:Navigation Drawer(Develop)

    Creating a Navigation Drawer THIS LESSON TEACHES YOU TO: Create a Drawer Layout Initialize the Drawe ...

随机推荐

  1. 使用OAuth打造webapi认证服务供自己的客户端使用(二)

    在上一篇”使用OAuth打造webapi认证服务供自己的客户端使用“的文章中我们实现了一个采用了OAuth流程3-密码模式(resource owner password credentials)的W ...

  2. Unity3D入门之Unity3D介绍以及编辑器的使用(1)

    1.Unity3D介绍 Unity3D是跨平台(IOS.Android.Windows Phone.Windows.Flash.XBOX360.PS3.Wii等)游戏引擎,可以开发2D.2.5D.3D ...

  3. 团队项目——站立会议DAY10

    第十次站立会议记录: 参会人员:张靖颜,钟灵毓秀,何玥,赵莹,王梓萱 项目进展: 1.张靖颜:进一步完善程序代码,提出扩展性的建议,增加程序的功能. 2.钟灵毓秀:修改已完成代码出现的bug,完善代码 ...

  4. [.net 面向对象程序设计进阶] (5) Lamda表达式(一) 创建委托

    [.net 面向对象程序设计进阶] (5) Lamda表达式(一)  创建委托 本节导读: 通过学习Lambda表达式,学会创建委托和表达式目录树,深入了解Lambda的特性,让你的代码变的更加清晰. ...

  5. FusionCharts简单教程(三)-----如何自定义图表上的工具提示

    最近有蛮多人总是问我这个FusionCharts制表的问题,帮助他们解决之后,在昨晚发现以前整理的笔记中有这个简单教程,而且以前也发表了几篇这个博文,所以就将其全部上传上来供别人参考.如有不正确之处望 ...

  6. java提高篇(二五)-----HashTable

          在java中与有两个类都提供了一个多种用途的hashTable机制,他们都可以将可以key和value结合起来构成键值对通过put(key,value)方法保存起来,然后通过get(key ...

  7. JavaScript思维导图—字符串函数

    JavaScript思维导图-来自@王子墨http://julying.com/blog/the-features-of-javascript-language-summary-maps/

  8. Knockout JS实现任务管理应用程序

    1.1.1 摘要 在博文<Ember.js实现单页面应用程序>中,我们介绍了使用Ember JS实现一个单页应用程序 (SPA),这使我想起了几年前写过一个任务管理程序,通过选择日期,然后 ...

  9. Java-面向对象基础练习

    1.编写一个Java应用程序,该应用程序包括2个类:Print类和主类E.Print 类里有一个方法output()功能是输出100 ~ 999之间的所有水仙花数(各位数字的 立方和等于这个三位数本身 ...

  10. jQuery插件开发的五种形态[转]

    这篇文章主要介绍了jQuery插件开发的五种形态小结,具体的内容就是解决javascript插件的8种特征,非常的详细. 关于jQuery插件的开发自己也做了少许研究,自己也写过多个插件,在自己的团队 ...