zoukankan      html  css  js  c++  java
  • Android Design Support Library(二)用NavigationView实现抽屉菜单界面

    NavigationView在MD设计中很重要,之前Google也提出了使用DrawerLayout来实现导航抽屉。

    这次,在Android Design Support Library中,Google提供了NavigationView来实现导航菜单界面。

    这次我们写的代码在Android用TabLayout实现相似网易选项卡动态滑动效果这篇文章代码的基础上进行改动,所以最好先看看上面这篇文章

    首先仍旧是配置build.gradle:

    dependencies {
        compile fileTree(dir: 'libs', include: ['*.jar'])
        compile 'com.android.support:appcompat-v7:22.2.0'
        compile 'com.android.support:design:22.2.0'
        compile 'com.android.support:recyclerview-v7:22.2.0'
        compile 'com.android.support:cardview-v7:22.2.0'
    }

    ‘com.android.support:design:22.2.0’com.android.support:design:22.2.0就是我们须要引入的Android Design Support Library,其次我们还引入了Recyclerview和Cardview。

    主界面布局(activity_tab_layout.xml)

    <?xml version="1.0" encoding="utf-8"?>
    
    <android.support.v4.widget.DrawerLayout
        android:id="@+id/dl_main_drawer"
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:fitsSystemWindows="true">
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".TabLayoutActivity"
        android:orientation="vertical">
    
        <android.support.design.widget.AppBarLayout
            android:id="@+id/appbar"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar">
            <android.support.v7.widget.Toolbar
                android:id="@+id/toolbar"
                android:layout_width="match_parent"
                android:layout_height="?attr/actionBarSize"
                app:layout_scrollFlags="scroll|enterAlways"
                app:popupTheme="@style/ThemeOverlay.AppCompat.Light"/>
    
            <android.support.design.widget.TabLayout
                android:id="@+id/tabs"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                app:tabIndicatorColor="#ADBE107E"
                app:tabMode="scrollable"/>
    
            </android.support.design.widget.AppBarLayout>
    
        <android.support.v4.view.ViewPager
            android:id="@+id/viewpager"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            app:layout_behavior="@string/appbar_scrolling_view_behavior"/>
    
    </LinearLayout>
    
        <android.support.design.widget.NavigationView
            android:id="@+id/nv_main_navigation"
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:layout_gravity="start"
            app:headerLayout="@layout/navigation_header"
            app:menu="@menu/drawer_view"/>
    </android.support.v4.widget.DrawerLayout>

    DrawerLayout标签包括了主界面的布局以及抽屉的布局。NavigationView标签下app:headerLayout=”” 能够引入头部文件
    app:menu=”“则引入菜单的布局。

    头部布局文件(navigation_header.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="150dp" android:background="?attr/colorPrimaryDark" android:orientation="horizontal" android:theme="@style/ThemeOverlay.AppCompat.Dark"> <ImageView android:layout_width="100dp" android:layout_height="100dp" android:layout_gravity="center_vertical" android:layout_marginLeft="50dp" android:background="@drawable/ic_user"/> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="10dp" android:layout_gravity="center_vertical" android:text="Liuwangshu" android:textAppearance="@style/TextAppearance.AppCompat.Body1" android:textSize="20sp"/> </LinearLayout>

    菜单布局文件(drawer_view.xml)

    <?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/nav_home"
                android:icon="@drawable/ic_dashboard"
                android:title="首页"/>
            <item
                android:id="@+id/nav_messages"
                android:icon="@drawable/ic_event"
                android:title="事项"/>
            <item
                android:id="@+id/nav_friends"
                android:icon="@drawable/ic_headset"
                android:title="音乐"/>
            <item
                android:id="@+id/nav_discussion"
                android:icon="@drawable/ic_forum"
                android:title="消息"/>
        </group>
    
        <item android:title="其它">
            <menu>
                <item
                    android:icon="@drawable/ic_dashboard"
                    android:title="设置"/>
                <item
                    android:icon="@drawable/ic_dashboard"
                    android:title="关于我们"/>
            </menu>
        </item>
    
    </menu>
    

    来看看主界面的java代码(TabLayoutActivity.java)

    package com.example.liuwangshu.mytablayout;
    import android.support.design.widget.NavigationView;
    import android.support.design.widget.TabLayout;
    import android.support.v4.app.Fragment;
    import android.support.v4.view.GravityCompat;
    import android.support.v4.view.ViewPager;
    import android.support.v4.widget.DrawerLayout;
    import android.support.v7.app.ActionBar;
    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    import android.support.v7.widget.Toolbar;
    import android.view.Menu;
    import android.view.MenuItem;
    
    import java.util.ArrayList;
    import java.util.List;
    
    public class TabLayoutActivity extends AppCompatActivity {
        private DrawerLayout mDrawerLayout;
        private ViewPager mViewPager;
        private TabLayout mTabLayout;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_tab_layout);
            Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
            setSupportActionBar(toolbar);
            final ActionBar ab = getSupportActionBar();
            ab.setHomeAsUpIndicator(R.drawable.ic_menu);
            ab.setDisplayHomeAsUpEnabled(true);
            mViewPager = (ViewPager) findViewById(R.id.viewpager);
            mDrawerLayout = (DrawerLayout) findViewById(R.id.dl_main_drawer);
            NavigationView navigationView =
                    (NavigationView) findViewById(R.id.nv_main_navigation);
            if (navigationView != null) {
                navigationView.setNavigationItemSelectedListener(
                        new NavigationView.OnNavigationItemSelectedListener() {
                            @Override
                            public boolean onNavigationItemSelected(MenuItem menuItem) {
                                menuItem.setChecked(true);
                                mDrawerLayout.closeDrawers();
                                return true;
                            }
                        });
            }
            initViewPager();
        }

    navigationView.setNavigationItemSelectedListener对菜单的条目进行了监听。假设被点击则将条目设置为选中状态并收回抽屉。当然别忘了对toolbar的菜单选项进行监听回调,否则抽屉就出不来了。


    (TabLayoutActivity.java)

      @Override
        public boolean onOptionsItemSelected(MenuItem item) {
            switch (item.getItemId()) {
                case android.R.id.home:
                    mDrawerLayout.openDrawer(GravityCompat.START);
                    return true;
            }
            return super.onOptionsItemSelected(item);
        }

    最后执行程序来看看效果
    这里写图片描写叙述

    github源代码下载

  • 相关阅读:
    不足百行代码 实体数组转DataTable通用类
    【翻译】WEB安全设计规范(4.1)
    也为读者说几句(兼为什么要骂烂书译者)
    重用之前应仔细分析问题用错轮子有感
    最长代码有多长:不符[单一职责原则(SRP)]的常见设计
    "千里之堤毁于蚁穴"重点项目不能交付之谜(一)泥淖中的验收测试
    企业快速开发框架基于配置文件
    从面试题看高级软件工程师需要哪些技艺
    面试英语【转】
    测试
  • 原文地址:https://www.cnblogs.com/clnchanpin/p/7074567.html
Copyright © 2011-2022 走看看