Navigation Drawer的使用及遇到的问题
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的使用及遇到的问题的更多相关文章
- Android UI开发第三十二篇——Creating a Navigation Drawer
Navigation Drawer是从屏幕的左侧滑出,显示应用导航的视图.官方是这样定义的: The navigation drawer is a panel that displays the ap ...
- Android UI开发第三十三篇——Navigation Drawer For Android API 7
Creating a Navigation Drawer中使用的Navigation Drawer的android:minSdkVersion="14",现在Android API ...
- Navigation Drawer介绍
在2013 google IO当天,Android团的更新了Support库,新版本(V13)的Support库中新加入了几个比较重要的功能. 添加 DrawerLayout 控件,支持创建 Nav ...
- Navigation Drawer(导航抽屉)
目录(?)[-] 创建一个导航抽屉 创建抽屉布局 初始化抽屉列表 处理导航项选点击事件 监听导航抽屉打开和关闭事件 点击应用图标来打开和关闭导航抽屉 创建一个导航抽屉 导航抽屉是一个位于屏幕左侧边缘用 ...
- Creating a Navigation Drawer 创建一个导航侧边栏
The navigation drawer is a panel that displays the app’s main navigation options on the left edge of ...
- Android官方终于支持 Navigation Drawer(导航抽屉)模式
在2013 google IO当天,Android团的更新了Support库,新版本(V13)的Support库中新加入了几个比较重要的功能. 添加 DrawerLayout 控件,支持创建 Nav ...
- Android Navigation Drawer(导航抽屉)
Google I/O 2013 Android 更新了Support库,新版本的Support库中新加入了几个比较重要的功能. 添加 DrawerLayout 控件,支持创建 Navigation ...
- Android - Navigation Drawer
http://www.jianshu.com/p/c8cbeb7ea43a 用Navigation Drawer 和 Navigation View 来实现左右侧滑 Activity里甚至什么都不用写 ...
- Android设计和开发系列第二篇:Navigation Drawer(Develop)
Creating a Navigation Drawer THIS LESSON TEACHES YOU TO: Create a Drawer Layout Initialize the Drawe ...
随机推荐
- [后端人员耍前端系列]KnockoutJs篇:使用KnockoutJs+Bootstrap实现分页
一.引言 由于最近公司的系统需要改版,改版的新系统我打算使用KnockoutJs来制作Web前端.在做的过程中,遇到一个问题——如何使用KnockoutJs来完成分页的功能.在前一篇文章中并没有介绍使 ...
- 在asp.net WebAPI 中 使用Forms认证和ModelValidata(模型验证)
一.Forms认证 1.在webapi项目中启用Forms认证 Why:为什么要在WebAPI中使用Forms认证?因为其它项目使用的是Forms认证. What:什么是Forms认证?它在WebAP ...
- Programming Entity Framework CodeFirst--数据库约定和配置
这一章主要主要讲的是我们的模型如何映射到数据库,而不影响模型,以及不同的映射场景. 一.表名和列名 1.指定表名 [Table("PersonPhotos")] public cl ...
- Angular实现递归指令 - Tree View
在层次数据结构展示中,树是一种极其常见的展现方式.比如系统中目录结构.企业组织结构.电子商务产品分类都是常见的树形结构数据. 这里我们采用Angular的方式来实现这类常见的tree view结构. ...
- [专业名词·硬件] 2、DC\DC、LDO电源稳压基本常识(包含基本原理、高效率模块设计、常见问题、基于nRF51822电源管理模块分析等)·长文
综述先看这里 第一节的1.1简单介绍了DC/DC是什么: 第二节是关于DC/DC的常见的疑问答疑,非常实用: 第三节是针对nRF51822这款芯片电源管理部分的DC/DC.LDO.1.8的详细分析,对 ...
- ASP.NET-自定义HttpModule与HttpHandler
在之前的ASP.NET是如何在IIS下工作的这篇文章中介绍了ASP.NET与IIS配合工作的机制,在http请求经过一系列处理后,最后到达ASP.NET管道中,这时,就是Http Modules和Ht ...
- Atitit.加密算法ati Aes的框架设计v2.2
Atitit.加密算法ati Aes的框架设计v2.2 版本进化1 V2.2 add def decode key api1 v1版本1 Aes的历史2 Atitit.加密算法 des aes ...
- Atitit usrQBK1600 技术文档的规范标准化解决方案
Atitit usrQBK1600 技术文档的规范标准化解决方案 1.1. Keyword关键词..展关键词,横向拓展比较,纵向抽象细化拓展知识点1 1.2. 标题必须有高大上词汇,参考文章排行榜,1 ...
- ui-router API
ui-router API 英文不咋地感觉找个API都要找半天, 拿好不谢 http://angular-ui.github.io/ui-router/site/#/api/ui.router
- 解决TryUpdateModel对象为空的问题
MVC中的TryUpdateModel确实给开发带来不少便利,但是如果绑定在View上的文本控件没有填写值的时候,再执行TryUpdateModel对应的实体属性就会为空. 如果数据库中对应的字段不允 ...