弹出自定义PopupMenu并将背景变灰

本文介绍了一种在Android中自定义PopMenu的方法,包括菜单项的添加、显示及背景透明度调整等功能。通过实例展示了如何使用自定义的PopMenu类来创建弹出菜单。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.PopMenu

import java.util.ArrayList;
import java.util.Map;

import android.content.Context;
import android.graphics.drawable.BitmapDrawable;
import android.view.LayoutInflater;
import android.view.MenuItem;
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.ImageView;
import android.widget.ListView;
import android.widget.PopupWindow;
import android.widget.TextView;

import com.centaline.framework.R;

public class PopMenu {
    private ArrayList<MenuItemBean> itemList;
    private Context context;
    private PopupWindow popupWindow;
    private ListView listView;
    private OnItemClickListener listener;
    private PopAdapter adapter;
    private PopupWindow.OnDismissListener dismissListener;


    public PopMenu(Context context) {
        // TODO Auto-generated constructor stub
        this.context = context;

        itemList = new ArrayList<MenuItemBean>();

        View view = LayoutInflater.from(context).inflate(R.layout.popmenu, null);

        //设置 listview
        listView = (ListView) view.findViewById(R.id.listView);
        adapter = new PopAdapter();
        listView.setAdapter(adapter);

        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(ArrayList<MenuItemBean> items) {
        itemList.addAll(items);
        adapter.notifyDataSetChanged();

    }

    //单个添加菜单项
    public void addItem(MenuItemBean item) {
        itemList.add(item);
        adapter.notifyDataSetChanged();
    }

    //下拉式 弹出 pop菜单 parent 右下角
    public void showAsDropDown(View parent) {
        popupWindow.showAsDropDown(parent, context.getResources().getDimensionPixelSize(R.dimen.popmenu_xoff),
                //保证尺寸是根据屏幕像素密度来的
                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.popmenu_item, null);
                holder = new ViewHolder();

                convertView.setTag(holder);

                holder.imageView = (ImageView) convertView.findViewById(R.id.imageView);
                holder.groupItem = (TextView) convertView.findViewById(R.id.textView);

            } else {
                holder = (ViewHolder) convertView.getTag();
            }

            holder.imageView.setImageResource((itemList.get(position)).iconRes);
            holder.groupItem.setText(itemList.get(position).text);

            return convertView;
        }

        private final class ViewHolder {
            ImageView imageView;
            TextView groupItem;
        }
    }

    public static class MenuItemBean {
        public int iconRes;
        public String text;

        public MenuItemBean(int iconRes, String text) {
            this.iconRes = iconRes;
            this.text = text;
        }
    }


    public void setDismissListener(PopupWindow.OnDismissListener dismissListener){
        this.dismissListener = dismissListener;

        popupWindow.setOnDismissListener(dismissListener);
    }

}

2. 调用

 final PopMenu popMenu = new PopMenu(getActivity());
                    backgroundAlpha(0.5f);
                    ArrayList<PopMenu.MenuItemBean> menus = new ArrayList<PopMenu.MenuItemBean>();

                    PopMenu.MenuItemBean item1 = new PopMenu.MenuItemBean(R.drawable.release_diary, "好孕日记  ");
                    PopMenu.MenuItemBean item2 = new PopMenu.MenuItemBean(R.drawable.release_topic, "发话题    ");
                    menus.add(item1);
                    menus.add(item2);
                    popMenu.addItems(menus);

                    popMenu.showAsDropDown(rightIcon);
                    popMenu.setOnItemClickListener(new OnItemClickListener() {
                        @Override
                        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                            if (position == 0) {
//                                Toast.makeText(getActivity(), "diary", Toast.LENGTH_SHORT).show();
                                MobclickAgent.onEvent(getActivity(), "101");
                                Intent releaseIntent = new Intent(getActivity(), ReleaseDairyActivity.class);
                                getActivity().startActivityForResult(releaseIntent, 127);
                                popMenu.dismiss();

                            } else {
//                                Toast.makeText(getActivity(), "topic", Toast.LENGTH_SHORT).show();

                                Intent releaseIntent = new Intent(getActivity(), ReleaseTopicActivity.class);
                                getActivity().startActivityForResult(releaseIntent, 127);
                                popMenu.dismiss();
                            }
                        }
                    });

                    popMenu.setDismissListener(new PopupWindow.OnDismissListener() {
                        @Override
                        public void onDismiss() {
                            backgroundAlpha(1f);
                        }
                    });


3.背景变灰

  /**
     * 设置添加屏幕的背景透明度
     * @param bgAlpha
     */
    public void backgroundAlpha(float bgAlpha)
    {
        WindowManager.LayoutParams lp = getActivity().getWindow().getAttributes();
        lp.alpha = bgAlpha; //0.0-1.0
        getActivity().getWindow().setAttributes(lp);
    }


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值