Android开发技巧——使用PopupWindow实现弹出菜单

当android原生的弹出菜单已不能满足我们的需求时,自定义菜单就成了我们的唯一选择,在本文当中,我将与大家分享如何使用PopupWindow实现弹出菜单。

1.弹出菜单的封装PopMenu

  1 import java.util.ArrayList;
  2 import cn.com.ista.pdachina.R;
  3 import android.content.Context;
  4 import android.graphics.drawable.BitmapDrawable;
  5 import android.view.LayoutInflater;
  6 import android.view.View;
  7 import android.view.ViewGroup;
  8 import android.view.ViewGroup.LayoutParams;
  9 import android.widget.AdapterView.OnItemClickListener;
 10 import android.widget.BaseAdapter;
 11 import android.widget.ImageView;
 12 import android.widget.ListView;
 13 import android.widget.PopupWindow;
 14 import android.widget.TextView;
 15 
 16 /**
 17  * 自定义弹出菜单
 18  * @author guopeng
 19  * @created 2015年11月27日
 20  */
 21 public class PopMenu {
 22 
 23     private Context context;
 24 
 25     private ArrayList<Item> itemList;
 26 
 27     private PopupWindow popupWindow;
 28 
 29     private ListView listView;
 30  
 31     public static class Item {  
 32         public String text;  
 33         public int id;  
 34   
 35         public Item(String text, int id) {  
 36             this.text = text;  
 37             this.id = id;  
 38         }  
 39     }  
 40     
 41     @SuppressWarnings("deprecation")
 42     public PopMenu(Context context) {
 43         
 44         this.context = context;
 45         itemList = new ArrayList<Item>(4);
 46         View view = LayoutInflater.from(context).inflate(R.layout.popmenu, null);
 47         
 48         //设置 listview
 49         listView = (ListView)view.findViewById(R.id.popup_view_listView);
 50         listView.setAdapter(new PopAdapter());
 51         listView.setFocusableInTouchMode(true);
 52         listView.setFocusable(true);
 53         
 54         popupWindow = new PopupWindow(view, 100, LayoutParams.WRAP_CONTENT);
 55         popupWindow = new PopupWindow(view, 
 56                 context.getResources().getDimensionPixelSize(R.dimen.popmenu_width), 
 57                 LayoutParams.WRAP_CONTENT);
 58         
 59         // 这个是为了点击“返回Back”也能使其消失,并且并不会影响你的背景(很神奇的)
 60         popupWindow.setBackgroundDrawable(new BitmapDrawable());
 61     }
 62 
 63     //设置菜单项点击监听器
 64     public void setOnItemClickListener(OnItemClickListener listener) {
 65         listView.setOnItemClickListener(listener);
 66     }
 67 
 68     //批量添加菜单项
 69     public void addItems(Item[] items) {
 70         for (Item s : items)
 71             itemList.add(s);
 72     }
 73 
 74     //单个添加菜单项
 75     public void addItem(Item item) {
 76         itemList.add(item);
 77     }
 78 
 79     //下拉式 弹出 pop菜单 parent 右下角
 80     public void showAsDropDown(View parent) {
 81         popupWindow.showAsDropDown(parent, 10, 
 82                 //保证尺寸是根据屏幕像素密度来的
 83                 context.getResources().getDimensionPixelSize(R.dimen.popmenu_yoff));
 84         
 85         // 使其聚集
 86         popupWindow.setFocusable(true);
 87         // 设置允许在外点击消失
 88         popupWindow.setOutsideTouchable(true);
 89         //刷新状态
 90         popupWindow.update();
 91     }
 92     
 93     //隐藏菜单
 94     public void dismiss() {
 95         popupWindow.dismiss();
 96     }
 97 
 98     // 适配器
 99     private final class PopAdapter extends BaseAdapter {
100 
101         @Override
102         public int getCount() {
103             return itemList.size();
104         }
105 
106         @Override
107         public Object getItem(int position) {
108             return itemList.get(position);
109         }
110 
111         @Override
112         public long getItemId(int position) {
113             return position;
114         }
115 
116         @Override
117         public View getView(int position, View convertView, ViewGroup parent) {
118             ViewHolder holder;
119             if (convertView == null) {
120                 convertView = LayoutInflater.from(context).inflate(R.layout.popmenu_item, null);
121                 holder = new ViewHolder();
122 
123                 convertView.setTag(holder);
124 
125                 holder.groupItem = (TextView) convertView.findViewById(R.id.pop_item_header);
126                 holder.groupImg = (ImageView) convertView.findViewById(R.id.pop_item_img);
127 
128             } else {
129                 holder = (ViewHolder) convertView.getTag();
130             }
131 
132             holder.groupItem.setText(itemList.get(position).text);
133             holder.groupImg.setBackgroundResource(itemList.get(position).id);
134             return convertView;
135         }
136 
137         private final class ViewHolder {
138             ImageView groupImg;
139             TextView groupItem;
140         }
141     }
142 }

弹出菜单布局popmenu.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/popup_view_cont"
    android:layout_width="@dimen/popmenu_width"
    android:layout_height="wrap_content"
    android:background="@drawable/popmenu_bg"
    android:orientation="vertical"
    android:paddingBottom="8.0dip"
    android:paddingLeft="8.0dip"
    android:paddingRight="8.0dip"
    android:paddingTop="16.0dip" >

    <ListView
        android:id="@+id/popup_view_listView"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:focusableInTouchMode="true"
        android:focusable="true"
        android:divider="@android:color/transparent"
        android:listSelector="@android:color/transparent"
        android:cacheColorHint="@android:color/transparent"
        android:scrollbars="none" >
    </ListView>

</LinearLayout>

菜单项布局popmenu_item.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="50dp"
    android:focusable="false"
    android:focusableInTouchMode="false"
    android:orientation="horizontal" >

    <ImageView
        android:id="@+id/pop_item_img"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_marginTop="10dp"
        android:layout_marginBottom="10dp"
        android:layout_marginLeft="10dp" />

    <TextView
        android:id="@+id/pop_item_header"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:background="@drawable/bg_pop_item"
        android:clickable="false"
        android:drawablePadding="3.0dip"
        android:gravity="center_vertical"
        android:padding="7.0dip"
        android:textColor="@color/white"
        android:layout_marginLeft="1dp"
        android:layout_weight="1"
        android:textSize="18.0sp" />

</LinearLayout>

2.PopMenu的使用

private PopMenu popMenu;

// 初始化弹出菜单
popMenu = new PopMenu(appContext);
popMenu.addItem(new Item("部分提交",R.drawable.popmeun_submit));
popMenu.addItem(new Item("结束安装",R.drawable.popmeun_terminate));
popMenu.addItem(new Item("从本地删除",R.drawable.popmeun_delete));
popMenu.addItem(new Item("返回首页",R.drawable.popmeun_home));

// 菜单项点击监听器
popMenu.setOnItemClickListener(popmenuItemClickListener);
// 弹出菜单监听器
    private OnItemClickListener popmenuItemClickListener = new OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            switch (position) {
            case 0:
                //部分提交
                popMenu.dismiss();
                break;
            case 1:
                //结束安装
                popMenu.dismiss();
                break;
            case 2:
                //从本地删除
                popMenu.dismiss();
                break;
            case 3:
                //返回首页
                popMenu.dismiss();
                break;
            }
        }

 

 

posted @ 2015-12-03 15:12  guopeng1987  阅读(4604)  评论(0编辑  收藏  举报