1. 程式人生 > >Android 側滑選單的實現(NavigationView)

Android 側滑選單的實現(NavigationView)

        很早之前就像寫個android的側滑選單加入到專案中了,但是很多給的都是密密麻麻的程式碼,今天看到了簡單快速的實現方法:通過NavigationView+DrawerLayout來實現側滑選單的功能。Google I/O 2015 給大家帶來了Android Design Support Library,對於希望做md風格的app的來說,簡直是天大的喜訊.NavigationView是是Google在5.0之後推出了NavitationView,就是我們左邊滑出來的那個選單。這個選單整體上分為兩部分,上面一部分叫做HeaderLayout,下面的那些點選項都是menu選單項,這樣的效果如果我們要自己寫肯定也能寫出來,但比較複雜,沒有必要,既然Google提供了這個控制元件,那我們當然選擇簡單的實現方式。

我們首先看一下這個最終的實現效果吧:


目前只是做了個簡單的效果,後面可以應用到不同的專案中,根據具體情況增加一些其他view控制元件。

馬上來看看是具體如何實現的吧:

1.首先要在project structure的dependence中匯入v4.design包,匯入後可以在build.grade下看到如下資訊:

compile 'com.android.support:design:25.2.0'
2.使用NavigationView

首先在主佈局檔案中使用DrawerLayout作為外包裝,裡面包含一個主頁面和側滑的選單頁面,而側滑選單頁面用NavigationView實現:

activity_main.layout:

<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.widget.DrawerLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_na"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=
"com.app.ui.MainActivity"> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@color/blue_700" android:gravity="center_vertical" android:orientation="horizontal"> <ImageView android:id="@+id/main_menu" android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@mipmap/mm" android:background="@color/blue_700" android:layout_margin="20dp"/> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1" android:text="旅行者說" android:textColor="#ffffff" android:textSize="20sp" android:layout_marginLeft="16dp"/> <ImageView android:id="@+id/search" android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@mipmap/three" android:background="@color/blue_700" android:layout_margin="20dp"/> </LinearLayout> <TextView android:layout_width="match_parent" android:layout_height="match_parent" android:text="主頁" android:textSize="22sp" android:gravity="center"/> </LinearLayout> <android.support.design.widget.NavigationView android:id="@+id/nav" android:layout_gravity="left" android:layout_width="wrap_content" android:layout_height="match_parent" android:fitsSystemWindows="true" xmlns:app="http://schemas.android.com/apk/res-auto" app:headerLayout="@layout/head" app:menu="@menu/new_menu" > </android.support.design.widget.NavigationView> </android.support.v4.widget.DrawerLayout>
以上可以這樣理解,drawerLayout中包含了主頁面和側滑的選單頁面,具體DrawerLayout用法參考官方文件。

我們可以看到

app:headerLayout="@layout/head"
app:menu="@menu/new_menu"

這兩個屬性,它們分別表示頭部的佈局(也就是選單的頭部)和menu選單,前者是佈局檔案而後者是選單檔案

來看下它們的具體內容:

首先是頭佈局:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:background="@color/blue_500">
    <ImageView
android:id="@+id/person"
android:layout_width="72dp"
android:layout_height="72dp"
android:layout_marginTop="42dp"
android:src="@mipmap/lufei"/>
    <TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="20sp"
android:layout_marginTop="24dp"
android:textColor="#ffffff"
android:text="沐風"/>
    <TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="16sp"
android:layout_marginTop="12dp"
android:textColor="#ffffff"
android:layout_marginBottom="18dp"
android:text="人生像一場沒有盡頭的旅行."/>

</LinearLayout>
頭佈局內容很簡單,只包含一張圖片和兩個textview

接下來是選單menu:

<?xml version="1.0" encoding="UTF-8" ?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <group
android:checkableBehavior="single">
        <item
android:id="@+id/favorite"
android:icon="@mipmap/v"
android:checkable="true"
android:title="    會員"/>

    </group>
    <item
android:id="@+id/wallet"
android:icon="@mipmap/wa"
android:title="    錢包"/>
    <item
android:id="@+id/photo"
android:icon="@mipmap/photo"
android:title="    相簿"/>
    <item
android:id="@+id/dress"
android:icon="@mipmap/dress1"
android:title="    裝扮"/>
    <item
android:id="@+id/file"
android:icon="@mipmap/file"
android:title="    檔案"/>

</menu>
menu裡包含了各個選單項,每個選單項可以設定icon和title以及點選狀態,關於menu的具體用法參考網上的文章:

http://blog.csdn.net/yuzhongchun/article/details/8956256

http://blog.csdn.net/a600423444/article/details/7417613

下面基本工作做完了,就到activity裡去設定一下點選事件吧:

public class MainActivity extends Activity implements View.OnClickListener {
    private DrawerLayout drawerLayout;
    private SystemBarTintManager tintManager;
    private NavigationView navigationView;
    ImageView menu;

    @Override
protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(R.layout.activity_main);
        initWindow();
        drawerLayout = (DrawerLayout) findViewById(R.id.activity_na);
        navigationView = (NavigationView) findViewById(R.id.nav);
        menu= (ImageView) findViewById(R.id.main_menu);
        View headerView = navigationView.getHeaderView(0);//獲取頭佈局
        menu.setOnClickListener(this);
        navigationView.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() {
            @Override
public boolean onNavigationItemSelected(@NonNull MenuItem item) {
                //item.setChecked(true);
Toast.makeText(MainActivity.this,item.getTitle().toString(),Toast.LENGTH_SHORT).show();
                drawerLayout.closeDrawer(navigationView);
                return true;
            }
        });
    }


    @Override
public void onClick(View v) {
        switch (v.getId()){
            case R.id.main_menu://點選選單,跳出側滑選單
                if (drawerLayout.isDrawerOpen(navigationView)){
                    drawerLayout.closeDrawer(navigationView);
                }else{
                    drawerLayout.openDrawer(navigationView);
                }
                break;
        }
    }
    private void initWindow() {//初始化視窗屬性,讓狀態列和導航欄透明
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
            getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
            getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
            tintManager = new SystemBarTintManager(this);
            int statusColor = Color.parseColor("#1976d2");
            tintManager.setStatusBarTintColor(statusColor);
            tintManager.setStatusBarTintEnabled(true);
        }
    }
}
側滑選單不僅通過手指滑動來實現,還可以通過主頁面的選單鍵點選的實現,詳情看上面程式碼,可以為選單項設定點選事件,通過
setNavigationItemSelectedListener

來實現,以上的此外,側滑選單頭佈局也可以設定點選事件,通過View head=navigtionview.getHeaderView實現,這裡的點選事件我沒有寫,這裡我還將狀態列的顏色改成了標題欄的顏色,達到整體的介面協調。具體實現方法可以參考文章http://blog.csdn.net/s1674521/article/details/59480114

3.思考如何關閉手勢滑動?

NavigationView的確沒有相關關閉側滑手勢的屬性,但是別忘了,drawerLayout卻可以,通過以下屬性可以關閉滑動手勢操作:

在android抽屜開發中,需要關閉手勢滑動,來滑出彈出框

mDrawer_layout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED);//關閉手勢滑動 mDrawer_layout.setDrawerLockMode(DrawerLayout.LOCK_MODE_UNLOCKED);//開啟手勢滑動

記錄到這就差不多了,其他具體功能可以根據需要自己新增,可以多看看官方md控制元件和規範,在後面的時間裡,我還回不定時記錄這些比較炫酷,優美的介面學習。

補充:本文僅作記錄和供大家借鑑,說明有誤或者不足改進之處希望大家提出並改正,謝謝。