Android自带抽屉布局及NavigationView的使用

在新版本的android sdk中,谷歌为开发者们带来了不少好用的东西,好比原生抽屉布局,下拉刷新等等,对很不乐意去网上找各类各样乱七八糟的第三方控件的某人真是挺不错的-。-2333html

图片描述

使用起来样子大概是这样的android

使用方式也很是简单,若是想省事的话直接利用add Navigation Drawer Activity就好了。
建立活动后,咱们可能会对其中的控件动态更新,可是接下来问题就来了。app

获取NavigationView的中的控件出现空指针异常

咱们在Navigation Drawer Activity中获取控件,第一反应就是直接在onCreateView里调用findViewById,例如我想获取上图中的TextView,假如id为tv_user布局

TextView tv = (TextView)findViewById(R.id.tv_user);

而后给tv改下字spa

tv.setText("Hello world");

这时候就会报错说tv为空指针。问题引发其实很是简单,是由于在activity刚建立的时候,Dawer实际上是没有打开的,因此布局没有初始化,天然也不能找到其中的空间。通常这种状况咱们为了获取这类未初始布局里的空间会使用inflate方法,这里其实处理是相似的,后面会提到。指针

咱们首先了解一下NavigationView的使用,新建一个抽屉活动后,咱们能够看到主界面的布局文件是这样的code

<?xml version="1.0" encoding="utf-8"?>
    <android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        android:id="@+id/drawer_layout"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:fitsSystemWindows="true"
        tools:openDrawer="start">
    
        <include
            layout="@layout/app_bar_main"
            android:layout_width="match_parent"
            android:layout_height="match_parent" />
    
        <android.support.design.widget.NavigationView
            android:id="@+id/nav_view"
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:layout_gravity="start"
            android:fitsSystemWindows="true"
            app:headerLayout="@layout/nav_header_main"
            app:menu="@menu/activity_main_drawer" />
    
    </android.support.v4.widget.DrawerLayout>

其实这里的NavigationView就是左边抽屉拉出来后的布局了~能够看到它有两个属性app:headerLayout和app:menu
其实这两个属性后面就分别是上图中蓝色背景部分的抽屉头和下面的菜单。要对其编辑也很简单,进入ID对应的布局修改便可。xml

操做1:

前面提到的获取不到控件的方法,能够在onCreate方法中这样来获取htm

View headerLayout = navigationView.inflateHeaderView(R.layout.nav_header_main);
    tv_nav_user = (TextView)headerLayout.findViewById(R.id.tv_nav_username);

经过查看谷歌官方开发文档咱们还能够发现几个方法
http://developer.android.com/reference/android/support/design/widget/NavigationView.html图片

clipboard.png

这些方法都是对抽屉布局上的菜单和头布局进行操做时可使用的。
同时注意

inflateHeaderView:Inflates a View and add it as a header of the navigation menu.

这也就是说咱们在进行前面的操做1实际上是得到该布局的同时把其加入到抽屉布局中去,这样就会出现下面的状况:
图片描述

操做2

解决方法也很简单,就是在layout文件中去掉

app:headerLayout="@layout/nav_header_main"

而后就能够获取到里面的控件愉快玩耍了~

补充:
其实若是不用上面的方法的话也是能够直接获取到header的,能够调用

View headerView = navigationView.getHeaderView(0);

来得到头部布局

相关文章
相关标签/搜索