android侧滑菜单笔记

一、SlidingPaneLayout

  v4包下的控件,使用简单,功能简洁。官方文档明确说明该控件只能左侧滑动。使用如下:

<android.support.v4.widget.SlidingPaneLayout
    android:id="@+id/slidingPaneLayout"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <ListView
        android:layout_width="200dp"
        android:layout_height="match_parent"/>

    <include layout="@layout/layout_main_content"/>

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

  SlidingPaneLayout有两个子节点: 第一个为菜单项布局,第二个为内容布局。

  java代码中找到该控件,设置监听:

  

SlidingPaneLayout spl = (SlidingPaneLayout) findViewById(R.id.slidingPaneLayout);
if (spl != null) {
    spl.setPanelSlideListener(new SlidingPaneLayout.PanelSlideListener() {

        @Override
        public void onPanelSlide(View panel, float slideOffset) {
            //正在滑动的监听
        }

        @Override
        public void onPanelOpened(View panel) {
            //打开的监听
        }

        @Override
        public void onPanelClosed(View panel) {
            //关闭的监听
        }
    });
}

二 DrawerLayout(抽屉效果)

  

android.support.v4.widget.DrawerLayout
    android:id="@+id/dl"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <TextView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="#ff00ff"
        android:gravity="start"
        android:text="主布局内容"/>

    <TextView
        android:layout_width="200dp"
        android:layout_height="match_parent"
        android:layout_gravity="start"
        android:background="#00ffff"
        android:text="侧边菜单栏内容"/>
</android.support.v4.widget.DrawerLayout>

    Drawerlayout标签中可以有三个子节点,一个是左边菜单,一个是主布局,还有右侧菜单,另外需要在左边菜单起始位置设置为                   android:layout_gravity="start"否则会报错

    注意:官方手册提示:内容控件必须写在第一个,并且不能含有layout_gravity属性

    示例代码如下:

private DrawerLayout dl;
private Toolbar toolbar;
private ActionBarDrawerToggle actionBarDrawerToggle;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);//设置标题为当前的Toolbar
    getSupportActionBar().setHomeButtonEnabled(true);//设置home按钮可用
    getSupportActionBar().setDisplayHomeAsUpEnabled(true);//设置显示回到主页的按钮可用,即:返回箭头显示出来
    dl = (DrawerLayout) findViewById(R.id.dl);//找到抽屉控件DrawerLayout
    //创建一个标题栏与抽屉的关联开关
actionBarDrawerToggle = new ActionBarDrawerToggle(this, dl, toolbar, R.string.app_name, R.string.app_name);
    actionBarDrawerToggle.syncState();//同步抽屉的指示器状态,只有加这一句抽屉的开关才会改变Toolbar上的NavigationIcon图标
    dl.addDrawerListener(actionBarDrawerToggle);//添加抽屉监听者,该监听者内部控制了ActionBar的NavigationIcon图标按钮
    dl.addDrawerListener(new DrawerLayout.DrawerListener() {//添加开发者自己处理的监听者

        @Override
        public void onDrawerSlide(View drawerView, float slideOffset) {
            System.out.println("----onDrawerSlide-  " + slideOffset);
        }

        @Override
        public void onDrawerOpened(View drawerView) {
            System.out.println("----onDrawerOpened-");
        }

        @Override
        public void onDrawerClosed(View drawerView) {
            System.out.println("----onDrawerClosed-");

        }

        @Override
        public void onDrawerStateChanged(int newState) {
            System.out.println("----onDrawerStateChanged-  " + newState);

        }
    });
}

三、NavigationView

  MD的控件,用于解决DrawerLayout中的菜单项设置太麻烦的问题,主流的做法都是用NavigationView来做DrawerLayout的菜单。

  

用于侧滑菜单中的menu布局。之前Google在V4包中推出自己的 DrawerLayout作为抽屉侧滑菜单,标准使用方法可以参考 google 原生态 抽屉式侧滑菜单 Android DrawerLayout 布局的使用介绍。 
当时的官方布局是这样的:

<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/drawer_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >
    <!-- the main content view -->
    <FrameLayout
        android:id="@+id/frame_content"
        android:layout_width="match_parent"
        android:layout_height="match_parent" >
    </FrameLayout>
    <ListView
        android:id="@+id/drawer_list"
        android:layout_width="240dp"
        android:layout_height="match_parent"
        android:layout_gravity="start"
        android:background="#9999cc"
        android:choiceMode="singleChoice"
        android:divider="@android:color/transparent"
        android:dividerHeight="0dp" >
    </ListView>
</android.support.v4.widget.DrawerLayout>  

   

其实这次谷歌只是将上面的ListView布局替换成NavigationView了。简化了之前ListView写适配器的繁琐。

先如今布局改成如下:

  

<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/drawer_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <!-- the main content view -->
    <include layout="@layout/layout_content" />
    <!-- the navigetion view -->
    <android.support.design.widget.NavigationView
     android:id="@+id/navigationView"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_gravity="left"
        android:fitsSystemWindows="true"
        app:headerLayout="@layout/layout_header"
        app:menu="@layout/layout_menu">
    </android.support.design.widget.NavigationView>
</android.support.v4.widget.DrawerLayout>

其中NavigationView 中的 android:layout_gravity=”start” 属性来控制抽屉菜单从哪边滑出,一般“start ”从左边滑出,“end”从右边滑出。

这里最主要的两个属性分别是: 
1.app:headerLayout: 给NavigationView添加头部布局 
2.app:menu:给NavigationView添加menu菜单布局

  代码中控制NavigationView

  

private void initNavigationView(){
        navigationView = (NavigationView) findViewById(R.id.navigationView);
        drawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
        //设置侧滑菜单选择监听事件
        navigationView.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() {
            @Override
            public boolean onNavigationItemSelected(MenuItem menuItem) {
                menuItem.setChecked(true);
                //关闭抽屉侧滑菜单
                drawerLayout.closeDrawers();
                return true;
            }
        });
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        if (item.getItemId() == android.R.id.home){
            //打开抽屉侧滑菜单
            drawerLayout.openDrawer(GravityCompat.START);
        }
        return super.onOptionsItemSelected(item);
    }

  

关于NavigationView中item的字体颜色和icon选中状态颜色是去当前主题theme中的

<--正常状态下字体颜色和icon颜色-->

<item name="android:textColorPrimary">@android:color/darker_gray</item>

<--选中状态icon的颜色和字体颜色-->

<item name="colorPrimary">@color/accent_material_light</item>

也可以通过如下方法或者属性来改变这一状态:

  1. setItemBackgroundResource(int):给menu设置背景资源,对应的属性app:itemBackground
  2. setItemIconTintList(ColorStateList):给menu的icon设置颜色,对应的属性app:itemIconTint
  3. setItemTextColor(ColorStateList):给menu的item设置字体颜色,对应的属性app:itemTextColor
时间: 2024-10-04 03:11:13

android侧滑菜单笔记的相关文章

Android侧滑菜单

1.使用Android Support Library实现 Android目前提供了很方便的侧滑集成,效果如下图所示 具体实现如下: 如果你使用Android Studio,在你的build.gradle文件中添加 dependencies { ... compile 'com.android.support:design:22.2.0' } 如果使用Eclipse(其实Android官方已经不推荐使用,如果要使用的话,可以参考http://developer.android.com/tools

Android 侧滑菜单的实现

Android 侧滑菜单的实现,参考网上的代码,实现侧滑菜单.最重要的是这个动画类UgcAnimations,如何使用动画类来侧滑的封装FlipperLayout. 本文项目源码:点击 1.实现效果 2.动画类UgcAnimations package com.mmsx.base; import android.content.Context; import android.view.View; import android.view.ViewGroup.MarginLayoutParams;

Android侧滑菜单DrawerLayout(抽屉布局)实现

应用场景: 由于侧滑菜单有更好的用户体验效果,所以更多的App使用侧滑抽屉式菜单列表,如网易客户端.百度影音.爱奇艺等等.至此,侧滑菜单有了更多的使用需求. 知识点介绍: 实现侧滑菜单功能的方法有很多,如果开源的项目SlidingMenu,下载地址为https://github.com/jfeinstein10/SlidingMenu.该开源项目依赖于另一个开源项目ActionBarSherlock,下载地址为https://github.com/JakeWharton/ActionBarShe

Android 侧滑菜单的简单实现(SlidingMenu)二

在上一篇博文中已经简单的实现了侧滑菜单,代码也很简单,就几行代码. 这篇文章依然讲侧滑菜单,与前一篇文章不同的是,这篇文章用不同的代码方式来实现侧滑菜单. 在前面的文章中已经用了在Activity中通过SlidingMenu构造方法直接设置侧滑菜单,这里换成通过Activity继承SlidingActivity来实现侧滑. 代码如下: public class MainActivity extends SlidingActivity 重写onCreate()方法: @Override publi

Android侧滑菜单完整详细示例(精装版)

MainActivity如下: package cn.patience7; import android.os.AsyncTask; import android.os.Bundle; import android.view.GestureDetector; import android.view.MotionEvent; import android.view.View; import android.view.View.OnTouchListener; import android.view

Android侧滑菜单完整详细示例(改进版)

MainActivity如下: package cc.cd; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import android.widget.ArrayAdapter;

Android侧滑菜单完整详细示例(基础版)

MainActivity如下: package cc.cd; import android.os.AsyncTask; import android.os.Bundle; import android.util.Log; import android.view.MotionEvent; import android.view.VelocityTracker; import android.view.View; import android.view.View.OnTouchListener; i

Android侧滑菜单DrawerLayout的使用

现在侧滑菜单使用很多,大都是通过SlidingMenu实现.现在也可以通过DrawerLayout 创建抽屉布局 frament_content.xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="

Android 侧滑菜单的简单实现(SlidingMenu)

在我还没有学习Android的时候就用过侧滑菜单的APP,当时第一个感觉是:哇塞,这效果不错!当然,现在自己都已经学Android了,这效果当然也要做出来啊~ SlidingMenu是一种比较新的设置界面或配置界面的效果(我觉得已经不新了耶~),在主界面左滑或者右滑出现设置界面效果,能方便的进行各种操作.很多优秀的应用都采用了这种界面方案,像facebook.人人网.everynote.Google+等等.效果如下图: 其实网上已经有很多写SlidingMenu使用的文章了.不过,别人始终是别人