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

android实现左右侧滑菜单效果

程序员文章站 2024-02-11 21:41:46
在android开发中,左右侧滑菜单的开发已成为我们现在开发的必备技术之一,再次之前,我没有做过相类似的demo,但是项目的开发有要求有这样的效果,而且大家都知道,虽然网上...

在android开发中,左右侧滑菜单的开发已成为我们现在开发的必备技术之一,再次之前,我没有做过相类似的demo,但是项目的开发有要求有这样的效果,而且大家都知道,虽然网上由开源的代码,但是不仅种类多,看着一个头两个大,而且代码不好分离。因此我们无法简化成自己的demo,为此,还查阅了很多别人的资料,最后做出了自己想要的效果,具体效果如下所示:

图1 左边菜单

android实现左右侧滑菜单效果 

图2 右边菜单

android实现左右侧滑菜单效果

今天要做的是把两个效果结合在一起,左右侧滑菜单

话不多说,直接上代码:

activity_main.xml:

<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" >

 <android.support.v4.widget.drawerlayout
 android:id="@+id/dl"
 android:layout_width="match_parent"
 android:layout_height="match_parent"
 android:layout_above="@+id/tv" >

 <!-- 作为侧拉菜单 主页面显示的效果 要写在布局的最上面 首先进行加载 -->
 <framelayout
  android:id="@+id/fl"
  android:layout_width="match_parent"
  android:layout_height="match_parent" >
 </framelayout>

 <listview
  android:id="@+id/lv"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  android:background="#ff0"
  android:layout_gravity="left" >
 </listview>

 <linearlayout
  android:id="@+id/ll"
  android:layout_width="200dp"
  android:layout_height="match_parent"
  android:layout_gravity="right"
  android:background="#0ff"
  android:orientation="vertical" >

  <imageview
  android:layout_width="100dp"
  android:layout_height="100dp"
  android:src="@drawable/ic_launcher" />

  <textview
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:layout_margin="20dp"
  android:text="呵呵呵" />
 </linearlayout>
 </android.support.v4.widget.drawerlayout>

</linearlayout>


frag_main.xml:

<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:gravity="center"
 android:orientation="vertical" >

 <textview
 android:id="@+id/tv_title"
 android:layout_width="wrap_content"
 android:layout_height="wrap_content"
 android:layout_margin="20dp"
 android:text="标题" />


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

</linearlayout>

mainactivity.java:

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

import com.example.day12drawerlayout1.fragment.mainfragment;

import android.os.bundle;
import android.support.v4.app.fragmentactivity;
import android.support.v4.app.fragmenttransaction;
import android.support.v4.widget.drawerlayout;
import android.support.v4.widget.drawerlayout.drawerlistener;
import android.util.log;
import android.view.gravity;
import android.view.view;
import android.widget.adapterview;
import android.widget.adapterview.onitemclicklistener;
import android.widget.arrayadapter;
import android.widget.listview;

/**
 * 1、静态和动态fragment的使用
 * 静态 直接在布局中使用<fragment />
 * 动态 使用管理器 得到一个事务 然后使用事务调用replace方法 把一个fragment对象替换到指定id的framlayout帧布局中
 * @author administrator
 *
 */
public class mainactivity extends fragmentactivity {

 drawerlayout dl;
 listview lv;

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

 dl = (drawerlayout) findviewbyid(r.id.dl);
 // framelayout fl = (framelayout) findviewbyid(r.id.fl);
 // fl.setonclicklistener(new onclicklistener() {
 //  
 //  @override
 //  public void onclick(view v) {
 //  // todo auto-generated method stub
 //  dl.opendrawer(gravity.right);
 //  }
 // });

 /**
  * set 一般是只有一个 如果再次调用会把前面的覆盖掉
  * 和 
  * add 把数据添加进去 不会覆盖之前的内容
  */
 dl.adddrawerlistener(new drawerlistener() {

  //滑动状态发生改变的时候 会调用该方法
  @override
  public void ondrawerstatechanged(int arg0) {
  // todo auto-generated method stub
  log.i("===============================", "statechanged" + arg0);
  }

  //监听滑动过程中 边界的位置
  @override
  public void ondrawerslide(view arg0, float arg1) {
  // todo auto-generated method stub
  log.i("===============================", "drawerslide" + arg1);
  }

  //监听侧拉是否完全展开
  @override
  public void ondraweropened(view arg0) {
  // todo auto-generated method stub
  log.i("===============================", "draweropened");
  }

  //监听侧拉是否被关闭
  @override
  public void ondrawerclosed(view arg0) {
  // todo auto-generated method stub
  log.i("===============================", "drawerclosed");
  }
 });

 showmain();
 showlv();
 }

 public drawerlayout getdl(){
 return dl;
 }

 private void showlv() {
 lv = (listview) findviewbyid(r.id.lv);
 final list<string> list = new arraylist<string>();
 for (int i = 1; i < 30; i++) {
  list.add("条目"+i);
 }
 arrayadapter<string> adapter = new arrayadapter<string>(this, android.r.layout.simple_list_item_1, list);
 lv.setadapter(adapter);

 lv.setonitemclicklistener(new onitemclicklistener() {

  @override
  public void onitemclick(adapterview<?> parent, view view,
   int position, long id) {
  // todo auto-generated method stub
  dl.closedrawer(gravity.left);
  //把点击的listview控件中的值 赋值到主fragment对象中
  mainfragment fragment = (mainfragment) getsupportfragmentmanager().findfragmentbytag("main");
  fragment.setdata(list.get(position));
  }
 });
 }

 /**
 * 在侧拉效果的页面中 用来显示主页面的效果
 */
 private void showmain() {
 //动态加载fragment
 fragmenttransaction transaction = getsupportfragmentmanager().begintransaction();
 //参数1:framlayout控件的id, 要替换的fragment对象
 transaction.replace(r.id.fl, new mainfragment(), "main");
 transaction.commit();
 }

}

mainfragment.java:

import android.os.bundle;
import android.support.annotation.nullable;
import android.support.v4.app.fragment;
import android.view.gravity;
import android.view.layoutinflater;
import android.view.view;
import android.view.view.onclicklistener;
import android.view.viewgroup;
import android.widget.imageview;
import android.widget.textview;

import com.example.day12drawerlayout1.mainactivity;
import com.example.day12drawerlayout1.r;

public class mainfragment extends fragment{
 textview tv;
 imageview iv;

 @override
 @nullable
 public view oncreateview(layoutinflater inflater,
  @nullable viewgroup container, @nullable bundle savedinstancestate) {

 view view = view.inflate(getactivity(), r.layout.frag_main, null);

 tv = (textview) view.findviewbyid(r.id.tv_title);
 iv = (imageview) view.findviewbyid(r.id.iv);

 iv.setonclicklistener(new onclicklistener() {

  @override
  public void onclick(view v) {
  // todo auto-generated method stub
  mainactivity activity = (mainactivity) getactivity();
  activity.getdl().opendrawer(gravity.right);
  }
 });

 return view;
 }

 public void setdata(string str){
 tv.settext(str);
 }
}

更多学习内容,可以点击《android侧滑效果汇总》学习。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。