服务器之家:专注于服务器技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - Android - Android编程之ICS式下拉菜单PopupWindow实现方法详解(附源码下载)

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

2021-04-22 17:22天使之翼 Android

这篇文章主要介绍了Android编程之ICS式下拉菜单PopupWindow实现方法,结合实例详细分析了ICS式下拉菜单的实现原理与相关技巧,并附带源码供读者下载,需要的朋友可以参考下

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

运行效果截图如下:

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

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

下面先讲一下实现原理:

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

popupwindow 的用法也很简单

主要方法:

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

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


3个参数 你要显示的view,显示宽度,显示高度
使用实例:

 

?
1
2
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 以外的区域能够关闭它。

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

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

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

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

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
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程序设计有所帮助。

延伸 · 阅读

精彩推荐