首先看一下效果吧

Android Design Support Library中增加了 NavigationView與DrawerLayout這個控件。代替SlidingMenu項目中的使用!
在這里讓我們來學習一下DrawerLayout和NavigationView的使用吧!
在工程中添加依賴:
compile 'com.android.support:design:25.0.0'
在Material Design中,NavigationView導航與DrawerLayout抽屜,被設計用于應用導航,提供了一種通用的導航方式,體現(xiàn)了設計的一致性。
NavigationView是一個導航菜單框架,使用menu資源填充數(shù)據(jù),使我們可以更簡單高效的實現(xiàn)導航菜單。
在XML中使用DrawerLayout與NavigationView進行布局
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 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/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="cn.hnshangyu.navigationview.MainActivity">
<android.support.v4.widget.DrawerLayout
android:id="@+id/drawer_layout"
android:layout_width="match_parent"
android:layout_height="match_parent">
<!--主頁面-->
<FrameLayout
android:id="@+id/fl_main"
android:background="@color/colorAccent"
android:layout_width="match_parent"
android:layout_height="match_parent" />
<!--側(cè)滑頁-->
<android.support.design.widget.NavigationView
android:id="@+id/navigation"
android:layout_width="320dp"
android:layout_height="match_parent"
android:layout_gravity="start"
app:headerLayout="@layout/drawer_header"
app:menu="@menu/drawer" />
</android.support.v4.widget.DrawerLayout>
</RelativeLayout>
注意其中NavigationView的兩個自定義屬性
app:headerLayout接收一個layout,作為導航菜單頂部的Header,即效果圖中的側(cè)滑頁圖片部分,開發(fā)中設置則有,不設置則無。
app:menu接收一個menu,作為導航菜單的菜單項,幾乎是必選項,不然這個控件就失去意義了。但也可以在運行時動態(tài)改變menu屬性。
用于NavigationView的典型menu文件,應該是一個可選中菜單項的集合。其中checked=”true”的item將會高亮顯示,這可以確保用戶知道當前選中的菜單項是哪個。
側(cè)滑頁頭布局drawer_header中的布局
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ImageView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:src="@mipmap/ic_recyclerview_09" />
</RelativeLayout>
在這里只設置了一張圖片,在這里其實有個疑惑,也是注意的地方,就是頭布局在Activity中怎么得到并設置點擊事件等操作呢?稍后看代碼!
menu/drawer的布局
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
tools:context=".MainActivity">
<group android:checkableBehavior="single">
<item
android:id="@+id/navigation_item_one"
android:icon="@mipmap/wsxx"
android:title="huangixoaguo" />
<item
android:id="@+id/navigation_item_two"
android:icon="@mipmap/wddd"
android:title="目錄" />
<item
android:id="@+id/navigation_item_three"
android:icon="@mipmap/wdyd"
android:title="佳佳" />
<item
android:id="@+id/navigation_item_four"
android:icon="@mipmap/wdyy"
android:title="鬧鐘" />
<item
android:id="@+id/navigation_item_five"
android:icon="@mipmap/sz"
android:title="設置" />
<item
android:id="@+id/navigation_subheader_one"
android:icon="@mipmap/sz"
android:title="子條目">
<menu>
<item
android:id="@+id/navigation_sub_item_one"
android:icon="@mipmap/wdyd"
android:title="佳佳" />
<item
android:id="@+id/navigation_sub_item_two"
android:icon="@mipmap/wdyy"
android:title="鬧鐘" />
</menu>
</item>
<item
android:id="@+id/navigation_subheader_two"
android:icon="@mipmap/sz"
android:title="子條目">
<menu>
<item
android:id="@+id/navigation_sub_item_four"
android:icon="@mipmap/wdyd"
android:title="佳佳" />
<item
android:id="@+id/navigation_sub_item_five"
android:icon="@mipmap/wdyy"
android:title="鬧鐘" />
</menu>
</item>
<item
android:id="@+id/navigation_subheader_three"
android:icon="@mipmap/sz"
android:title="子條目">
<menu>
<item
android:id="@+id/navigation_sub_item_six"
android:icon="@mipmap/wdyd"
android:title="佳佳" />
<item
android:id="@+id/navigation_sub_item_seven"
android:icon="@mipmap/wdyy"
android:title="鬧鐘" />
</menu>
</item>
<item
android:id="@+id/navigation_subheader_four"
android:icon="@mipmap/sz"
android:title="子條目">
<menu>
<item
android:id="@+id/navigation_sub_item_eight"
android:icon="@mipmap/wdyd"
android:title="佳佳" />
<item
android:id="@+id/navigation_sub_item_nine"
android:icon="@mipmap/wdyy"
android:title="鬧鐘" />
</menu>
</item>
</group>
</menu>
里面使用menu的嵌套,來顯示分組子標題!
Activity中的操作
package cn.hnshangyu.navigationview;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.design.widget.NavigationView;
import android.support.v4.widget.DrawerLayout;
import android.support.v7.app.AppCompatActivity;
import android.view.MenuItem;
import android.view.View;
import android.widget.FrameLayout;
import android.widget.ImageView;
import android.widget.RelativeLayout;
import butterknife.Bind;
import butterknife.ButterKnife;
import cn.hnshangyu.navigationview.utils.UIUtils;
public class MainActivity extends AppCompatActivity {
@Bind(R.id.fl_main)
FrameLayout flMain;
@Bind(R.id.navigation)
NavigationView mNavigationView;
@Bind(R.id.drawer_layout)
DrawerLayout mDrawerLayout;
private RelativeLayout headerView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ButterKnife.bind(this);
//得到頭布局
headerView = (RelativeLayout) mNavigationView.getHeaderView(0);
initListener();
}
private MenuItem lastItem;
private void initListener() {
mNavigationView.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() {
@Override
public boolean onNavigationItemSelected(@NonNull MenuItem item) {
switch (item.getItemId()) {
case R.id.navigation_item_one:
break;
case R.id.navigation_item_two:
break;
case R.id.navigation_item_three:
break;
case R.id.navigation_item_four:
break;
case R.id.navigation_sub_item_one:
break;
case R.id.navigation_sub_item_two:
break;
case R.id.navigation_sub_item_four:
break;
case R.id.navigation_sub_item_five:
break;
case R.id.navigation_sub_item_six:
break;
case R.id.navigation_sub_item_seven:
break;
case R.id.navigation_sub_item_eight:
break;
case R.id.navigation_sub_item_nine:
break;
case R.id.navigation_item_five:
break;
}
if (lastItem != null) {
lastItem.setChecked(false);
}
item.setChecked(true);
lastItem = item;
UIUtils.showToast(item.getTitle().toString());
mDrawerLayout.closeDrawers();
return false;
}
});
headerView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
UIUtils.showToast("頭像");
mDrawerLayout.closeDrawers();
}
});
}
}
用setNavigationItemSelectedListener方法來設置當導航項被點擊時的回調(diào)。OnNavigationItemSelectedListener會提供給我們被選中的MenuItem,這與Activity的onOptionsItemSelected非常類似。通過這個回調(diào)方法,我們可以處理點擊事件,改變item的選中狀態(tài),更新頁面內(nèi)容,關閉導航菜單,以及任何我們需要的操作。
其中的到headview的方法在這里我使用的是: navigationView.getHeaderView(0)的方式,如果子view較多
headerView = navigationView.getHeaderView(0);
headImg = (ImageButton)headerView.findViewById(R.id.user_head_img);
userName = (TextView) headerView.findViewById(R.id.user_name);
userDescription = (TextView) headerView.findViewById(R.id.user_description);
這種方式可以得到子view。
或:
先在Activity中聲明NavigationView,然后再通過View view = NavigationView.inflateHeaderView(int LayoutResID)這個方法導入頭部布局文件,
這就意味著在NavigationView中不會靜態(tài)去設置app:header屬性,并且獲取了頭部的View,這樣就可以通過View.findId...()方法來定位和監(jiān)聽了。
好了,差不多到這里基本的使用方法就實現(xiàn)了!有不好的地方,歡迎大家指出….謝謝?。。?/p>
Demo下載:http://download.csdn.net/detail/huangxiaoguo1/9742204