Navigation Drawer的使用及遇到的问题

时间:2022-05-18 00:29:55

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://*.com/questions/22742073/error-view-android-widget-listview-is-not-a-sliding-drawer/22742093