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的话,第三个组件就不需要了。如下:

 1 <?xml version="1.0" encoding="utf-8"?>
 2 <android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
 3     android:id="@+id/drawer_layout"
 4     android:layout_width="match_parent"
 5     android:layout_height="match_parent">
 6 
 7     <FrameLayout
 8         android:id="@+id/content_frame"
 9         android:layout_width="match_parent"
10         android:layout_height="match_parent" />
11 
12 
13     <ListView
14         android:id="@+id/left_drawer"
15         android:layout_width="240dp"
16         android:layout_height="match_parent"
17         android:layout_gravity="start"
18         android:choiceMode="singleChoice"
19         android:divider="@android:color/transparent"
20         android:dividerHeight="0dp"
21         android:background="#fff" />
22 </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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏IMWeb前端团队

向zepto.js学习如何手动(trigger)触发DOM事件

本文作者:IMWeb 谦龙 原文出处:IMWeb社区 未经同意,禁止转载 前言 前端在最近几年实在火爆异常,vue、react、angular各路框...

2655
来自专栏C/C++基础

CVTE2017秋季校招笔试题回忆(C++后台岗)

2016.09.06晚参加了CVTEC++岗的在线笔试。笔试题型分为不定向选择题和编程题,总共27题。其中不定项选择题为25道,编程题2道。其特点是不定项选择题...

1001
来自专栏软件开发

前端MVC学习总结(一)——MVC概要与angular概要、模板与数据绑定

一、前端MVC概要 1.1、库与框架的区别 ? 框架是一个软件的半成品,在全局范围内给了大的约束。库是工具,在单点上给我们提供功能。框架是依赖库的。Angula...

32410
来自专栏更流畅、简洁的软件开发方式

Step By Step 一步一步写网站[1] —— 填加数据

填加数据是一个项目必不可少的部分,也是一个基础操作,使用也是最频繁的。 那么您是怎么实现添加数据的呢? 添加数据可以分为几种情况。 1、单表添加,不需要事务。...

20910
来自专栏Google Dart

Flutter Widget框架之旅 顶

Flutter小部件采用现代反应式框架构建,从React中获得灵感。 中心思想是你从小部件中构建你的UI。 小组件描述了他们的视图在给定其当前配置和状态时应该看...

5522
来自专栏yukong的小专栏

【SpringBoot2.0系列10】SpringBoot之@Scheduled任务调度实现结语

相信大家在实际工作场景中会遇到这样的情况,系统之间存在数据交换,为了不影响正常服务器运,我们需要在每天的凌晨来进行数据交换,但是让程序每天凌晨自动执行呢,下面带...

7312
来自专栏安恒网络空间安全讲武堂

Web for Pentester 实验合集

0x00 introduction Pentester Lab 是渗透测试学习实战平台,在里面提供各种漏洞实验的虚拟机镜像文件,让网络安全爱好者和黑阔进行实战式...

2505
来自专栏北京马哥教育

有关bash,我希望我能知晓的十件事

1735
来自专栏向治洪

Mpg123源代码详解

Mpg123与libmad一样,支持mpeg1,2,2.5音频解码。目前来看mpg123比libmad支持了网络播放功能。而且libmad基本上开源社区在200...

2207
来自专栏软件开发

前端MVC学习总结(一)——MVC概要与angular概要、模板与数据绑定

框架是一个软件的半成品,在全局范围内给了大的约束。库是工具,在单点上给我们提供功能。框架是依赖库的。AngularJS是框架而jQuery则是库。

1103

扫码关注云+社区

领取腾讯云代金券