當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; } }