欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Android实现原生侧滑菜单的超简单方式

程序员文章站 2024-03-05 20:50:49
先来看看效果图 当你点击菜单可以更改图标,例如点击happy,首页就会变一个笑脸,这个实现的过程超级简单 你需要使用toolbar与drawablelayout两个...

先来看看效果图

Android实现原生侧滑菜单的超简单方式

当你点击菜单可以更改图标,例如点击happy,首页就会变一个笑脸,这个实现的过程超级简单

你需要使用toolbar与drawablelayout两个比较新的控件

首先要写三个xml布局文件,我这里的布局文件是使用了include标签嵌入的,代码如下

headbar_toolbar.xml

<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.toolbar xmlns:android="http://schemas.android.com/apk/res/android"
 android:id="@+id/tbheadbar"
 android:layout_width="match_parent"
 android:layout_height="50dp"
 android:background="@color/red">

 <textview
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:layout_gravity="center"
  android:text="@string/emotion"
  android:textcolor="@color/white"
  android:textsize="16sp" />

</android.support.v7.widget.toolbar>

my_drawablelayout.xml

<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.widget.drawerlayout xmlns:android="http://schemas.android.com/apk/res/android"
 android:id="@+id/dlmenu"
 android:layout_width="match_parent"
 android:layout_height="match_parent">

 <linearlayout
  android:id="@+id/llcontent"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  android:background="@color/white"
  android:gravity="center"
  android:orientation="vertical">

  <imageview
   android:id="@+id/ivcontent"
   android:layout_width="100dp"
   android:layout_height="100dp"
   android:src="@drawable/angry" />

 </linearlayout>

 <!--android:layout_gravity="start"属性使这部分作为侧滑部分-->
 <!--一定要放在下面!!!关于控件的层次性如果不知道的同学去百度!哦不去谷歌-->
 <linearlayout
  android:id="@+id/llmenu"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  android:layout_gravity="start"
  android:background="@color/white"
  android:orientation="vertical">

  <!--用于设置菜单项-->
  <listview
   android:id="@+id/lvmenu"
   android:layout_width="match_parent"
   android:layout_height="match_parent"
   android:divider="@null" />

 </linearlayout>

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

main_activity.xml

<?xml version="1.0" encoding="utf-8"?>
<linearlayout xmlns:android="http://schemas.android.com/apk/res/android"
 xmlns:tools="http://schemas.android.com/tools"
 android:layout_width="match_parent"
 android:layout_height="match_parent"
 android:orientation="vertical"
 tools:context="com.demo.usher.demo_slidingmenu.mainactivity">

 <!--头部-->
 <include layout="@layout/headbar_toolbar" />

 <!--主布局-->
 <include layout="@layout/my_drawablelayout" />

</linearlayout>

如何应用在java文件中【一个文件搞定】

package com.demo.usher.demo_slidingmenu;

import android.os.bundle;
import android.support.v4.widget.drawerlayout;
import android.support.v7.app.actionbardrawertoggle;
import android.support.v7.app.appcompatactivity;
import android.support.v7.widget.toolbar;
import android.view.view;
import android.widget.adapterview;
import android.widget.arrayadapter;
import android.widget.imageview;
import android.widget.linearlayout;
import android.widget.listview;

import java.util.arraylist;
import java.util.list;

import butterknife.bindview;
import butterknife.butterknife;

public class mainactivity extends appcompatactivity {

 @bindview(r.id.tbheadbar)
 toolbar mtbheadbar;

 /*侧滑菜单布局*/
 @bindview(r.id.llmenu)
 linearlayout mllmenu;

 /*侧滑菜单listview放置菜单项*/
 @bindview(r.id.lvmenu)
 listview mlvmenu;

 @bindview(r.id.ivcontent)
 imageview mivcontent;

 @bindview(r.id.dlmenu)
 drawerlayout mmydrawable;

 actionbardrawertoggle mtoggle;

 private list<string> lvmenulist = new arraylist<string>() {{
  add("angry");
  add("happy");
  add("sad");
  add("embarrassed");
 }};

 private list<integer> imagelist = new arraylist<integer>() {{
  add(r.drawable.angry);
  add(r.drawable.happy);
  add(r.drawable.sad);
  add(r.drawable.embarrassed);
 }};

 @override
 protected void oncreate(bundle savedinstancestate) {
  super.oncreate(savedinstancestate);
  setcontentview(r.layout.activity_main);
  butterknife.bind(this);

  /*初始化toolbar与drawablelayout*/
  inittoolbaranddrawablelayout();

  mlvmenu.setadapter(new arrayadapter(this, android.r.layout.simple_expandable_list_item_1, lvmenulist));
  mlvmenu.setonitemclicklistener(new adapterview.onitemclicklistener() {
   @override
   public void onitemclick(adapterview<?> parent, view view, int position, long id) {
    mivcontent.setimageresource(imagelist.get(position));
    mmydrawable.closedrawers();/*收起抽屉*/
   }
  });
 }

 private void inittoolbaranddrawablelayout() {
  setsupportactionbar(mtbheadbar);
  /*以下俩方法设置返回键可用*/
  getsupportactionbar().sethomebuttonenabled(true);
  getsupportactionbar().setdisplayhomeasupenabled(true);
  /*设置标题文字不可显示*/
  getsupportactionbar().setdisplayshowtitleenabled(false);

  mtoggle = new actionbardrawertoggle(this, mmydrawable, mtbheadbar, r.string.open, r.string.close) {
   @override
   public void ondraweropened(view drawerview) {
    super.ondraweropened(drawerview);
    //toast.maketext(mainactivity.this, r.string.open, toast.length_short).show();
   }

   @override
   public void ondrawerclosed(view drawerview) {
    super.ondrawerclosed(drawerview);
    //toast.maketext(mainactivity.this, r.string.close, toast.length_short).show();
   }
  };
  /*mmydrawable.setdrawerlistener(mtoggle);不推荐*/
  mmydrawable.adddrawerlistener(mtoggle);
  mtoggle.syncstate();/*同步状态*/
 }
}

关于butterknife注解与样式

butterknife直接在gradle文件中配置好如下【缺什么就补什么】

apply plugin: 'com.android.application'
apply plugin: 'android-apt'

android {
 compilesdkversion 24
 buildtoolsversion "24.0.2"

 defaultconfig {
  applicationid "com.demo.usher.demo_slidingmenu"
  minsdkversion 15
  targetsdkversion 24
  versioncode 1
  versionname "1.0"
 }
 buildtypes {
  release {
   minifyenabled false
   proguardfiles getdefaultproguardfile('proguard-android.txt'), 'proguard-rules.pro'
  }
 }

}

buildscript {
 repositories {
  mavencentral()
 }
 dependencies {
  classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'
 }
}

dependencies {
 compile filetree(include: ['*.jar'], dir: 'libs')
 testcompile 'junit:junit:4.12'
 compile 'com.android.support:appcompat-v7:24.2.0'
 compile 'com.jakewharton:butterknife:8.4.0'
 /*butterknife相关*/
 apt 'com.jakewharton:butterknife-compiler:8.4.0'
 compile 'com.android.support:support-v4:24.2.0'
}

style【关于返回键的颜色样式等在style文件中修改】

<resources>

 <style name="apptheme" parent="theme.appcompat.light.noactionbar">
  <item name="drawerarrowstyle">@style/apptheme.drawerarrowtoggle</item>
 </style>

 <style name="apptheme.drawerarrowtoggle" parent="base.widget.appcompat.drawerarrowtoggle">
  <item name="color">@android:color/white</item>
 </style>

</resources>

总结

其实很多时候我们在使用第三方控件的时候往往不知道背后是怎么实现的,使用原生控件可以让我们更好的理解一个交互或者说实现一个功能的原理,有利于做出性能与交互都非常优秀的app,以上就是这篇文章的全部内容,希望对大家的工作或学习带来一定的帮助。