Android弹出菜单【转】

来源:互联网 发布:房地产知乎 编辑:程序博客网 时间:2024/06/05 21:02

来自:http://blog.csdn.net/ywl5320/article/details/47160059

在实际开发中,我们可能会用到toolbar控件,然后还要在右上角添加弹出菜单,但是toolbar弹出菜单,实在是不好控制位置,因此用户体验很是不好,所以 就想到了用popupwindow来代替弹出的菜单。话不多说先看效果(文章末尾有demo下载地址):


效果还是基本能接受的。

下面讲讲实现过程:

一:菜单布局,很简单,和一般的布局一样,linearlayout中包裹textview和imageview(需要图片的话)

[html] view plain copy
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:layout_width="wrap_content"  
  4.     android:layout_height="wrap_content"  
  5.     android:gravity="center_horizontal"  
  6.     android:background="@drawable/icon_popupwin_menu_bg"  
  7.     android:orientation="vertical" >  
  8.     <LinearLayout  
  9.         android:id="@+id/ly_item1"  
  10.         android:layout_width="match_parent"  
  11.         android:layout_height="45dip"  
  12.         android:gravity="center_vertical"  
  13.         android:orientation="horizontal"   
  14.         android:background="@drawable/bg_default_button_selector">  
  15.   
  16.         <TextView  
  17.             android:layout_width="wrap_content"  
  18.             android:layout_height="wrap_content"  
  19.             android:textSize="15sp"  
  20.             android:paddingLeft="20dip"  
  21.             android:textColor="#595d5f"  
  22.             android:text="选项卡一" />  
  23.           
  24.     </LinearLayout>  
  25.     <View  
  26.         android:layout_width="match_parent"  
  27.         android:layout_height="1dip"  
  28.         android:background="#eeeeee" />  
  29.     <LinearLayout  
  30.         android:id="@+id/ly_item2"  
  31.         android:layout_width="match_parent"  
  32.         android:layout_height="45dip"  
  33.         android:gravity="center_vertical"  
  34.         android:orientation="horizontal"   
  35.         android:background="@drawable/bg_default_button_selector">  
  36.   
  37.         <ImageView  
  38.             android:layout_width="wrap_content"  
  39.             android:layout_height="wrap_content"  
  40.             android:paddingLeft="20dip"  
  41.             android:paddingRight="20dip"  
  42.             android:visibility="gone" />  
  43.   
  44.         <TextView  
  45.             android:layout_width="wrap_content"  
  46.             android:layout_height="wrap_content"  
  47.             android:textSize="15sp"  
  48.             android:paddingLeft="20dip"  
  49.             android:textColor="#595d5f"  
  50.             android:text="选项卡二" />  
  51.     </LinearLayout>  
  52.     <View  
  53.         android:layout_width="match_parent"  
  54.         android:layout_height="1dip"  
  55.         android:background="#eeeeee" />  
  56.     <LinearLayout  
  57.         android:id="@+id/ly_item3"  
  58.         android:layout_width="match_parent"  
  59.         android:layout_height="45dip"  
  60.         android:gravity="center_vertical"  
  61.         android:orientation="horizontal"  
  62.         android:background="@drawable/bg_default_button_selector" >  
  63.   
  64.         <ImageView  
  65.             android:layout_width="wrap_content"  
  66.             android:layout_height="wrap_content"  
  67.             android:paddingLeft="20dip"  
  68.             android:paddingRight="20dip"  
  69.             android:visibility="gone" />  
  70.   
  71.         <TextView  
  72.             android:layout_width="wrap_content"  
  73.             android:layout_height="wrap_content"  
  74.             android:textSize="15sp"  
  75.             android:paddingLeft="20dip"  
  76.             android:textColor="#595d5f"  
  77.             android:text="选项卡三" />  
  78.     </LinearLayout>  
  79.   
  80. </LinearLayout>  

这里用了标题栏和点击变色效果,这不是这次的重点,所以就不说了,不懂可以在博客最后下载demo来看,hh~

二:继承PopupWindow实现自己的菜单
主要是添加布局文件,设置布局文件位置,并未选项添加点击回调接口,代码如下,注释也详细:

[java] view plain copy
  1. package com.ywl5320.popupmenu;  
  2.   
  3. import android.app.Activity;  
  4. import android.content.Context;  
  5. import android.graphics.drawable.ColorDrawable;  
  6. import android.view.LayoutInflater;  
  7. import android.view.View;  
  8. import android.view.View.OnClickListener;  
  9. import android.widget.LinearLayout.LayoutParams;  
  10. import android.widget.PopupWindow;  
  11.   
  12. public class PopupMenu extends PopupWindow implements OnClickListener {  
  13.   
  14.     private Activity activity;  
  15.     private View popView;  
  16.   
  17.     private View v_item1;  
  18.     private View v_item2;  
  19.     private View v_item3;  
  20.   
  21.     private OnItemClickListener onItemClickListener;  
  22.   
  23.     /** 
  24.      *  
  25.      * @author ywl5320 枚举,用于区分选择了哪个选项 
  26.      */  
  27.     public enum MENUITEM {  
  28.         ITEM1, ITEM2, ITEM3  
  29.     }  
  30.   
  31.     public PopupMenu(Activity activity) {  
  32.         super(activity);  
  33.         this.activity = activity;  
  34.         LayoutInflater inflater = (LayoutInflater) activity  
  35.                 .getSystemService(Context.LAYOUT_INFLATER_SERVICE);  
  36.         popView = inflater.inflate(R.layout.popup_menu, null);// 加载菜单布局文件  
  37.         this.setContentView(popView);// 把布局文件添加到popupwindow中  
  38.         this.setWidth(dip2px(activity, 120));// 设置菜单的宽度(需要和菜单于右边距的距离搭配,可以自己调到合适的位置)  
  39.         this.setHeight(LayoutParams.WRAP_CONTENT);  
  40.         this.setFocusable(true);// 获取焦点  
  41.         this.setTouchable(true); // 设置PopupWindow可触摸  
  42.         this.setOutsideTouchable(true); // 设置非PopupWindow区域可触摸  
  43.         ColorDrawable dw = new ColorDrawable(0x00000000);  
  44.         this.setBackgroundDrawable(dw);  
  45.   
  46.         // 获取选项卡  
  47.         v_item1 = popView.findViewById(R.id.ly_item1);  
  48.         v_item2 = popView.findViewById(R.id.ly_item2);  
  49.         v_item3 = popView.findViewById(R.id.ly_item3);  
  50.         // 添加监听  
  51.         v_item1.setOnClickListener(this);  
  52.         v_item2.setOnClickListener(this);  
  53.         v_item3.setOnClickListener(this);  
  54.   
  55.     }  
  56.   
  57.   
  58.     /** 
  59.      * 设置显示的位置 
  60.      *  
  61.      * @param resourId 
  62.      *            这里的x,y值自己调整可以 
  63.      */  
  64.     public void showLocation(int resourId) {  
  65.         showAsDropDown(activity.findViewById(resourId), dip2px(activity, 0),  
  66.                 dip2px(activity, -8));  
  67.     }  
  68.   
  69.     @Override  
  70.     public void onClick(View v) {  
  71.         // TODO Auto-generated method stub  
  72.         MENUITEM menuitem = null;  
  73.         String str = "";  
  74.         if (v == v_item1) {  
  75.             menuitem = MENUITEM.ITEM1;  
  76.             str = "选项卡一";  
  77.         } else if (v == v_item2) {  
  78.             menuitem = MENUITEM.ITEM2;  
  79.             str = "选项卡二";  
  80.         } else if (v == v_item3) {  
  81.             menuitem = MENUITEM.ITEM3;  
  82.             str = "选项卡三";  
  83.         }  
  84.         if (onItemClickListener != null) {  
  85.             onItemClickListener.onClick(menuitem, str);  
  86.         }  
  87.         dismiss();  
  88.     }  
  89.   
  90.     // dip转换为px  
  91.     public int dip2px(Context context, float dipValue) {  
  92.         final float scale = context.getResources().getDisplayMetrics().density;  
  93.         return (int) (dipValue * scale + 0.5f);  
  94.     }  
  95.   
  96.     // 点击监听接口  
  97.     public interface OnItemClickListener {  
  98.         public void onClick(MENUITEM item, String str);  
  99.     }  
  100.   
  101.     // 设置监听  
  102.     public void setOnItemClickListener(OnItemClickListener onItemClickListener) {  
  103.         this.onItemClickListener = onItemClickListener;  
  104.     }  
  105.   
  106. }  


三:然后在MainActivity中调用:

初始化菜单,然后设置菜单位置,添加回调就OK了

[java] view plain copy
  1. package com.ywl5320.popupmenu;  
  2.   
  3. import android.app.Activity;  
  4. import android.os.Bundle;  
  5. import android.view.View;  
  6. import android.view.View.OnClickListener;  
  7. import android.widget.ImageView;  
  8. import android.widget.Toast;  
  9.   
  10. import com.ywl5320.popupmenu.PopupMenu.MENUITEM;  
  11. import com.ywl5320.popupmenu.PopupMenu.OnItemClickListener;  
  12.   
  13. public class MainActivity extends Activity {  
  14.   
  15.     private ImageView iv_menu;  
  16.     private PopupMenu popupMenu;  
  17.   
  18.     @Override  
  19.     protected void onCreate(Bundle savedInstanceState) {  
  20.         super.onCreate(savedInstanceState);  
  21.         setContentView(R.layout.activity_main);  
  22.   
  23.         popupMenu = new PopupMenu(this);  
  24.   
  25.         iv_menu = (ImageView) findViewById(R.id.iv_menu);  
  26.   
  27.         iv_menu.setOnClickListener(new OnClickListener() {  
  28.   
  29.             @Override  
  30.             public void onClick(View v) {  
  31.                 // TODO Auto-generated method stub  
  32.                 popupMenu.showLocation(R.id.iv_menu);// 设置弹出菜单弹出的位置  
  33.                 // 设置回调监听,获取点击事件  
  34.                 popupMenu.setOnItemClickListener(new OnItemClickListener() {  
  35.   
  36.                     @Override  
  37.                     public void onClick(MENUITEM item, String str) {  
  38.                         // TODO Auto-generated method stub  
  39.                         Toast.makeText(MainActivity.this, str, 0).show();  
  40.                     }  
  41.                 });  
  42.             }  
  43.         });  
  44.     }  
  45. }  
我们还是看看title的布局吧,也很简单:

[html] view plain copy
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:layout_width="match_parent"  
  4.     android:layout_height="55dip"  
  5.     android:background="#262a3b">  
  6.       
  7.     <ImageView  
  8.         android:id="@+id/iv_back"  
  9.         android:layout_width="50dip"  
  10.         android:layout_height="match_parent"  
  11.         android:layout_alignParentLeft="true"  
  12.         android:layout_centerVertical="true"  
  13.         android:scaleType="centerInside"  
  14.         android:visibility="invisible"/>  
  15.       
  16.     <TextView   
  17.         android:id="@+id/tv_title"  
  18.         android:layout_width="match_parent"  
  19.         android:layout_height="match_parent"  
  20.         android:singleLine="true"  
  21.         android:layout_toLeftOf="@+id/iv_menu"  
  22.         android:layout_toRightOf="@+id/iv_back"  
  23.         android:gravity="center"  
  24.         android:text="标题栏"  
  25.         android:textColor="#ffffff"  
  26.         android:textSize="22sp"  
  27.         android:layout_centerInParent="true"/>  
  28.   
  29.     <ImageView  
  30.         android:id="@+id/iv_menu"  
  31.         android:layout_width="50dip"  
  32.         android:layout_height="match_parent"  
  33.         android:layout_alignParentRight="true"  
  34.         android:layout_centerVertical="true"  
  35.         android:scaleType="centerInside"  
  36.         android:src="@drawable/menu_icon"/>  
  37. </RelativeLayout>  


这样就实现了右上角弹出菜单,其实不止是在右上角,可以再任意位置弹出菜单,微信点赞那种也可以,好了,就到这里了:Demo下载



0 0
原创粉丝点击