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

Android编程之ICS式下拉菜单PopupWindow实现方法详解(附源码下载)

程序员文章站 2023-12-14 22:40:22
本文实例讲述了android编程之ics式下拉菜单popupwindow实现方法。分享给大家供大家参考,具体如下: 运行效果截图如下: 右边这个就是下拉菜单啦,看见...

本文实例讲述了android编程之ics式下拉菜单popupwindow实现方法。分享给大家供大家参考,具体如下:

运行效果截图如下:

Android编程之ICS式下拉菜单PopupWindow实现方法详解(附源码下载)

右边这个就是下拉菜单啦,看见有的地方叫他 ics式下拉菜单,哎哟,不错哦!

下面先讲一下实现原理:

这种菜单实际上就是一个弹出式的菜单,于是我们想到android popupwindow 类,给他设置一个view 在弹出来不就ok了吗。

popupwindow 的用法也很简单

主要方法:

步骤1.new 一个实例出来,我们使用这个构造方法即可,

复制代码 代码如下:
public popupwindow (view contentview, int width, int height)

3个参数 你要显示的view,显示宽度,显示高度
使用实例:
view view = layoutinflater.from(context).inflate(r.layout.popmenu, null);
popupwindow = new popupwindow(view, 100, layoutparams.wrap_content);

很简单吧,不用多说,如果你这2句看不懂先看下基础去咯。

步骤2:显示出来

复制代码 代码如下:
popupwindow.showasdropdown(parent,10, 10);

参数:附着在哪个view(应该是根据这个parent来确定弹出位置),相对于parent的x轴偏移 ,相对于parent的y轴偏移

这2个步骤就可以吧他弹出来,下面注意几个很重要的细节

注意下面所做的3条是为了使 点击popuwindow 以外的区域能够关闭它。

// 使其聚集
popupwindow.setfocusable(true);
// 设置允许在外点击消失
popupwindow.setoutsidetouchable(true);
//刷新状态(必须刷新否则无效)
popupwindow.update();

下面这点是为了使 按返回按钮能够关闭popuwindow

// 这个是为了点击“返回back”也能使其消失,并且并不会影响你的背景(很神奇的) 
popupwindow.setbackgrounddrawable(new bitmapdrawable());
//网上找的我也不知道为什么

ok上面就介绍完了使用原理,知道了原理大家就可以自己做弹出菜单了对吧。

下面给大家分享我封装好的 popmenu 类

package com.tszy.wight;
import java.util.arraylist;
import android.content.context;
import android.graphics.drawable.bitmapdrawable;
import android.view.layoutinflater;
import android.view.view;
import android.view.viewgroup;
import android.view.viewgroup.layoutparams;
import android.widget.adapterview.onitemclicklistener;
import android.widget.baseadapter;
import android.widget.listview;
import android.widget.popupwindow;
import android.widget.textview;
import com.tszy.watergate.r;
public class popmenu {
 private arraylist<string> itemlist;
 private context context;
 private popupwindow popupwindow ;
 private listview listview;
 //private onitemclicklistener listener;
 public popmenu(context context) {
  // todo auto-generated constructor stub
  this.context = context;
  itemlist = new arraylist<string>(5);
  view view = layoutinflater.from(context).inflate(r.layout.popmenu, null);
  //设置 listview
  listview = (listview)view.findviewbyid(r.id.listview);
  listview.setadapter(new popadapter());
  popupwindow = new popupwindow(view, 100, layoutparams.wrap_content);
  popupwindow = new popupwindow(view, 
    context.getresources().getdimensionpixelsize(r.dimen.popmenu_width),
    layoutparams.wrap_content);
  // 这个是为了点击“返回back”也能使其消失,并且并不会影响你的背景(很神奇的)
  popupwindow.setbackgrounddrawable(new bitmapdrawable());
 }
 //设置菜单项点击监听器
 public void setonitemclicklistener(onitemclicklistener listener) {
  //this.listener = listener;
  listview.setonitemclicklistener(listener);
 }
 //批量添加菜单项
 public void additems(string[] items) {
  for (string s : items)
   itemlist.add(s);
 }
 //单个添加菜单项
 public void additem(string item) {
  itemlist.add(item);
 }
 //下拉式 弹出 pop菜单 parent 右下角
 public void showasdropdown(view parent) {
  popupwindow.showasdropdown(parent, 10,
    //保证尺寸是根据屏幕像素密度来的
    context.getresources().getdimensionpixelsize(r.dimen.popmenu_yoff));
  // 使其聚集
  popupwindow.setfocusable(true);
  // 设置允许在外点击消失
  popupwindow.setoutsidetouchable(true);
  //刷新状态
  popupwindow.update();
 }
 //隐藏菜单
 public void dismiss() {
  popupwindow.dismiss();
 }
 // 适配器
 private final class popadapter extends baseadapter {
  @override
  public int getcount() {
   // todo auto-generated method stub
   return itemlist.size();
  }
  @override
  public object getitem(int position) {
   // todo auto-generated method stub
   return itemlist.get(position);
  }
  @override
  public long getitemid(int position) {
   // todo auto-generated method stub
   return position;
  }
  @override
  public view getview(int position, view convertview, viewgroup parent) {
   // todo auto-generated method stub
   viewholder holder;
   if (convertview == null) {
    convertview = layoutinflater.from(context).inflate(r.layout.pomenu_item, null);
    holder = new viewholder();
    convertview.settag(holder);
    holder.groupitem = (textview) convertview.findviewbyid(r.id.textview);
   } else {
    holder = (viewholder) convertview.gettag();
   }
   holder.groupitem.settext(itemlist.get(position));
   return convertview;
  }
  private final class viewholder {
   textview groupitem;
  }
 }
}

这个类里面引用到很多资源文件,布局文件,这些大家可以自己去实现,我就不贴上了。

具体代码本站下载地址如下:

项目源码

模拟服务器端源码

希望本文所述对大家android程序设计有所帮助。

上一篇:

下一篇: