自定义的弹出菜单

先上图:



自定义的PopMenu类:

package com.app.view;


import java.util.ArrayList;
import java.util.List;


import android.content.Context;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.PopupWindow;


import com.app.utils.TDevice;
import com.base.fun.R;


/**
 * 由下向上弹出菜单
 */
public class MyPopMenu {


/**
* 菜单点击事件
*/
public static interface MenuClick {
/**
* 点击了菜单项
*/
public void onClick(MenuItem item);


/**
* 点击了取消按钮
*/
public void onCancel();


/**
* 点击了空白处
*/
public void onClickBlank();
}


/**
* 菜单项
*/
public static class MenuItem {
public int id; // 菜单ID
public String label; // 菜单label


public MenuItem(int id, String label) {
this.id = id;
this.label = label;
}


@Override
public String toString() {
return "MenuItem [id=" + id + ", label=" + label + "]";
}
}


// 弹出菜单的ID、显示label
private ArrayList<MenuItem> mMenus;


// 菜单点击回调
private MenuClick mCallback;


private Context mContext;


/**
* 弹出菜单

* @param menus
*            菜单项
* @param callback
*            菜单点击回调
*/
public MyPopMenu(Context ctx, ArrayList<MenuItem> menus, MenuClick callback) {
mContext = ctx;
mMenus = menus;
mCallback = callback;
initPopupWindow();
}


/**
* 初始化菜单项
*/
private View initMenus(Context ctx) {
LayoutInflater inflater = LayoutInflater.from(ctx);


View root = inflater.inflate(R.layout.lyt_pop_menu, null);
if (mMenus == null && mMenus.isEmpty()) {
return root;
}


root.setOnClickListener(new View.OnClickListener() {


@Override
public void onClick(View v) {
if (mCallback != null) {
// 点击空白处
mCallback.onClickBlank();
}
}
});


ViewGroup lytMenus = (ViewGroup) root.findViewById(R.id.lyt_menus);
lytMenus.removeAllViews();
// 添加菜单项
for (int i = 0, size = mMenus.size(); i < size; ++i) {
final MenuItem item = mMenus.get(i);
View vMenu = inflater.inflate(R.layout.lyt_menu_item, null);
lytMenus.addView(vMenu);
vMenu.setId(item.id); // 菜单ID
vMenu.setTag(item);


// 第一个菜单是不显示上面的“分割线的”
if (i == 0) {
vMenu.findViewById(R.id.line).setVisibility(View.GONE);
}
Button btn = (Button) vMenu.findViewById(R.id.btn_menu);
btn.setText(item.label);
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (mCallback != null) {
mCallback.onClick(item);
}
}
});
}


// 取消按钮
root.findViewById(R.id.btn_cancel).setOnClickListener(
new View.OnClickListener() {
@Override
public void onClick(View v) {
if (mCallback != null) {
mCallback.onCancel();
}
}
});


return root;
}


private PopupWindow mPopupWindow;


/**
* 设置菜单enable状态
*/
public void setEnabelMenu(int menuId, boolean enabel) {
if (mPopupWindow != null) {
View root = mPopupWindow.getContentView();
if (root != null) {
ViewGroup lytMenus = (ViewGroup) root
.findViewById(R.id.lyt_menus);
for (int i = 0, count = lytMenus.getChildCount(); i < count; ++i) {
View menu = lytMenus.getChildAt(i);
if (menu.getId() == menuId) {
menu.setEnabled(enabel);
menu.findViewById(R.id.btn_menu).setEnabled(enabel);
break;
}
}
}
}
}


private void initPopupWindow() {
if (mPopupWindow == null) {
mPopupWindow = new PopupWindow(mContext);
mPopupWindow = new PopupWindow((int) TDevice.getScreenWidth(),
(int) TDevice.getScreenHeight());


View vMenus = initMenus(mContext);
mPopupWindow.setContentView(vMenus);
}
}


/**
* 显示菜单
*/
public void show(View parentView) {
initPopupWindow();


if (mPopupWindow.isShowing()) {
return;
}
mPopupWindow.showAtLocation(parentView, Gravity.CENTER, 0, 0);
}


/**
* 隐藏菜单
*/
public void hide() {
mPopupWindow.dismiss();
}
}


layout文件:

1、菜单item

<?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="match_parent"
    android:orientation="vertical" >


    <View
        android:id="@+id/line"
        android:layout_width="match_parent"
        android:layout_height="1dip"
        android:background="@color/color_listview_divider" />


    <Button
        android:id="@+id/btn_menu"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@color/white"
        android:text="@string/str_cancel" />


</LinearLayout>


2、菜单layout:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/lyt_popmenu"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#7f000000" >


    <Button
        android:id="@+id/btn_cancel"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_marginBottom="10dip"
        android:layout_marginLeft="10dip"
        android:layout_marginRight="10dip"
        android:layout_marginTop="@dimen/space_15"
        android:background="@drawable/menu_bkg"
        android:text="@string/str_cancel" />


    <LinearLayout
        android:id="@+id/lyt_menus"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_above="@id/btn_cancel"
        android:layout_marginLeft="10dip"
        android:layout_marginRight="10dip"
        android:background="@drawable/menu_bkg"
        android:orientation="vertical" >


        <include layout="@layout/lyt_menu_item" />


        <include layout="@layout/lyt_menu_item" />


        <include layout="@layout/lyt_menu_item" />
    </LinearLayout>


</RelativeLayout>


使用代码:


// 点击头像弹出菜单

private MyPopMenumPopMenus;

// 菜单项

private ArrayList<MenuItem>mMenus;

// 菜单回调

private MenuClickmMenuClickListener =new MenuClick() {


@Override

public void onClick(MenuItem item) {

if (item !=null) {

if (MENU_ID_DELETE == item.id) {

// 删除...

} else if (MENU_ID_TAKEPHOTO == item.id) {

jumpToTakePhoto();

} else if (MENU_ID_SELECT == item.id) {

jumpToSelectPic();

}

}

onCancel();

}


@Override

public void onCancel() {

if (mPopMenus !=null) {

mPopMenus.hide();

}

}


@Override

public void onClickBlank() {

onCancel();

}

};


// 点击头像弹出的菜单项

privatefinalint MENU_ID_DELETE = 0;

privatefinalint MENU_ID_TAKEPHOTO = 1;

privatefinalint MENU_ID_SELECT = 2;


/**

* 点击头像,弹出菜单

*/

private void showHeaderMenus() {

if (mPopMenus ==null) {

mMenus = new ArrayList<MenuItem>();

mMenus.add(new MenuItem(MENU_ID_DELETE,"删除"));

mMenus.add(new MenuItem(MENU_ID_TAKEPHOTO,"拍照"));

mMenus.add(new MenuItem(MENU_ID_SELECT,"从相册里选择"));


mPopMenus =new MyPopMenu(this,mMenus,mMenuClickListener);

// 灰掉“删除菜单”

mPopMenus.setEnabelMenu(MENU_ID_DELETE,false);

}

mPopMenus.show(findViewById(R.id.lyt_header));

}





  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值