Design包下NavigationView的使用

首先介紹一下由來,只屬於個人見解。Design包是5.0之後出現的新特性,其包含了許多新出現且具有自己特色的控件。除今天要說的NavigationView導航佈局之外,還有TabLayout、RecyclerView、CardView、FloatActionButton、Snackbar、TextInputLayout,還有協調者佈局CoordinatorLayout等等等等。

我對於這個的理解個人只是覺得Google不想讓android的再一問的去模仿IOS所做出來的效果,有了這個,Google更有了底氣。

首先需要在AS上搜索design.

之後選擇design.

成功之後你的build.gradle文件上會多出之後就可以愉快的使用NavigationView啦.

因爲是NavigationView,所以定義在DrawerLayout中。所以佈局中我們也需要把NavigationView定義在DrawerLayout的根標籤下。

首先看一下佈局文件  activity_main.xml

<?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"
    android:id="@+id/drawerLayout_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">
        <TextView
            android:id="@+id/tv"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="drawerlayout + navigationview"/>
    </LinearLayout>

    <android.support.design.widget.NavigationView
        android:id="@+id/navigation_main"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_gravity="left"
        app:headerLayout="@layout/header_navigation"
        app:menu="@menu/menu_navigation_main"/>

</android.support.v4.widget.DrawerLayout>

這裏需要注意的是要用NavigationView特有的屬性需要添加

xmlns:app="http://schemas.android.com/apk/res-auto"
的命名空間。其中
android:layout_gravity="left"
代表NavigationView從哪邊彈出。

app:headerLayout="@layout/header_navigation"
這個屬性可以在NavigationView上添加一個頭佈局。它也是一個xml佈局文件。
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <ImageView
        android:id="@+id/imageView"
        android:layout_width="match_parent"
        android:layout_height="100dp"
        android:scaleType="fitXY"
        android:src="@mipmap/sakura05" />
</LinearLayout>
app:menu="@menu/menu_navigation_main"
這個屬性是代表NavigationView中的每一個item,它是一個menu.下面是menu_navigation_main.xml文件

<menu xmlns:android="http://schemas.android.com/apk/res/android"
      xmlns:app="http://schemas.android.com/apk/res-auto">
    <group
        android:checkableBehavior="single">

        <item
            android:id="@+id/action_common"
            android:checked="true"
            android:icon="@android:drawable/ic_dialog_dialer"
            android:title="我的收藏"/>
        <item
            android:id="@+id/action_menu"
            android:icon="@android:drawable/ic_dialog_email"
            android:title="我的相冊"/>

        <item
            android:id="@+id/action_transform"
            android:icon="@android:drawable/ic_dialog_map"
            android:title="我的文件"/>

        <item
            android:id="@+id/action_other"
            android:checked="false"
            android:title="其他操作">

            <menu>
                <group
                    android:checkableBehavior="single">
                    <item
                        android:id="@+id/action_qq"
                        android:checked="false"
                        android:icon="@android:drawable/ic_btn_speak_now"
                        android:title="QQ好友"/>

                    <item
                        android:id="@+id/action_weixin"
                        android:checked="false"
                        android:icon="@android:drawable/ic_dialog_alert"
                        android:title="微信好友"/>

                </group>
            </menu>
        </item>

    </group>
</menu>

好了。佈局寫好了。下面介紹用法。下面貼上MainActivity的代碼
public class MainActivity extends AppCompatActivity {

    private Context mContext = this;
    private DrawerLayout drawerLayout_main;
    private NavigationView navigationView_main;
    private TextView tv;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        initView();
        initActionBar();
    }

    //初始化ActionBar
    private void initActionBar() {
        ActionBar actionBar = getSupportActionBar();
        actionBar.setTitle("打開抽屜");
        actionBar.setDisplayHomeAsUpEnabled(true);
//        actionBar.setHomeAsUpIndicator(android.R.drawable.ic_dialog_info);
    }

    private void initView() {
        drawerLayout_main = (DrawerLayout) findViewById(R.id.drawerLayout_main);
        navigationView_main = (NavigationView) findViewById(R.id.navigation_main);
        tv = ((TextView) findViewById(R.id.tv));

        // 設置導航菜單寬度
        ViewGroup.LayoutParams params = navigationView_main.getLayoutParams();
        params.width = getResources().getDisplayMetrics().widthPixels * 1 / 2;
        navigationView_main.setLayoutParams(params);

        //設置NavigationView菜單條目的點擊監聽
        navigationView_main.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() {
            @Override
            public boolean onNavigationItemSelected(MenuItem item) {
                switch (item.getItemId()) {
                    case R.id.action_common:
                        Toast.makeText(mContext, "點擊了第1個菜單", Toast.LENGTH_SHORT).show();
                        break;
                    case R.id.action_menu:
                        Toast.makeText(mContext, "點擊了第2個菜單", Toast.LENGTH_SHORT).show();
                        break;
                    case R.id.action_transform:
                        Toast.makeText(mContext, "點擊了第3個菜單", Toast.LENGTH_SHORT).show();
                        break;
                    case R.id.action_qq:
                        Toast.makeText(mContext, "點擊了第4個菜單", Toast.LENGTH_SHORT).show();
                        break;
                    case R.id.action_weixin:
                        Toast.makeText(mContext, "點擊了第5個菜單", Toast.LENGTH_SHORT).show();
                        break;
                }
                item.setChecked(true);
                //關閉抽屜
                drawerLayout_main.closeDrawer(navigationView_main);
                //或者:drawerLayout.closeDrawers();
                return true;
            }
        });

    }

    //配置ActionBar的home鍵點擊監聽
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            case android.R.id.home:
                //打開左側的抽屜
                if (drawerLayout_main.isDrawerOpen(GravityCompat.START)) {
                    drawerLayout_main.closeDrawer(GravityCompat.START);
                } else {
                    drawerLayout_main.openDrawer(GravityCompat.START);
                }
        }
        return super.onOptionsItemSelected(item);
    }

}
 // 設置導航菜單寬度
        ViewGroup.LayoutParams params = navigationView_main.getLayoutParams();
        params.width = getResources().getDisplayMetrics().widthPixels * 1 / 2;
        navigationView_main.setLayoutParams(params);
這段是得到屏幕的寬,然後得到它的一半,付給navigationView,這樣NavigationView的寬度就是屏幕的一半。

navigationView_main.setNavigationItemSelectedListener()
這個是爲NavigationView註冊監聽事件。根據點擊的menu id進行判斷。

關閉NavigationView有兩種。

一種是用DrawerLayout調用closeDrawer();NavigationView作爲參數。

drawerLayout_main.closeDrawer(navigationView_main);
一種是也是closeDrawers();這種不用傳遞參數。注意看,兩種並不一樣。

drawerLayout_main.isDrawerOpen(GravityCompat.START)
這個方法是判斷NavigationView是否打開。


最後看下效果圖:



好了。今天就寫到這裏。希望大家都能看得明白。

共勉!




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章