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 ...
随机推荐
- Async Console Programs 异步控制台程序
如果你正在写一个控制台程序,你可能最终想要一个异步的main方法,像这样: class Program { static async void Main(string[] args) { ... } ...
- Sensor(GYROSCOPE)
package com.example.sensor01; import java.util.List; import android.hardware.Sensor; import android. ...
- Wix 安装部署教程(十一) ---QuickWix
这次发布的是这两天做的一个WIX工具QuickWIX,主要解决两个问题点1.对大文件快速生成wix标签(files,Directories,ComponentRef):2.比较前后两次工程的差异.大的 ...
- C#性能优化之Lazy<T> 实现延迟初始化
在.NET4.0中,可以使用Lazy<T> 来实现对象的延迟初始化,从而优化系统的性能.延迟初始化就是将对象的初始化延迟到第一次使用该对象时.延迟初始化是我们在写程序时经常会遇到的情形,例 ...
- 根据Excel的内容和word模板生成对应的word文档
Sub setname() Dim I As Integer Dim pspname As String Dim pspnumber As String Dim path As String Dim ...
- [安卓] 16、ListView和GridView结合显示单元实现自定义列表显示效果
List在各种手机应用中都有体现,是安卓UI设计的必修课. 本文将介绍在开发中如何利用ListView和GridView设计自定义列表. 下面分别是用ListView和GridView做的效果: 上面 ...
- IOS Animation-CAKeyframeAnimation例子(简单动画实现)
在阅读本文之前,可以看看 CABasicAnimation的例子 也可以看看IOS Animation-CABasicAnimation.CAKeyframeAnimation详解&区别&am ...
- Java基础之多线程
1.进程和线程: 进程:正在进行的程序.每一个进程执行都有一个执行顺序,该顺序是一个执行路径,或者叫一个控制单元. 线程:进程内部的一条执行路径或者一个控制单元. 两者的区别: 一个进程至少有一个线程 ...
- 大叔也说Xamarin~Android篇~支付宝SDK的错误与解决
回到目录 在为android程序引入支付宝后,可能没有那么顺利,有能出现各种各样的问题,大叔在引用支付宝后就出现了APL64的错误,在网上找不很多资料都不对正,还是在官网找到了几句话,说到了点子上,具 ...
- js笔记——理解js中的call及apply
call及apply在js里经常碰得到,但一直感觉很陌生,不能熟练使用.怎样才能熟练应用呢? 为什么存在call和apply? 在javascript OOP中,我们经常会这样定义: function ...