package com.netease.nim.uikit.common.ui.popupmenu; import android.content.Context; import android.content.res.Configuration; import android.graphics.drawable.BitmapDrawable; import android.view.KeyEvent; import android.view.LayoutInflater; import android.view.View; import android.view.View.OnKeyListener; import android.view.ViewGroup.LayoutParams; import android.view.WindowManager; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import android.widget.ListView; import android.widget.PopupWindow; import android.widget.PopupWindow.OnDismissListener; import com.netease.nim.uikit.R; import com.netease.nim.uikit.common.util.sys.ScreenUtil; import java.util.List; public class NIMPopupMenu { public static int TYPE_BG_WHITE = 0; public static int TYPE_BG_BLACK = 1; private int typeBg = 0; private Context context; private List<PopupMenuItem> items; private PopupMenuAdapter adapter; private MenuItemClickListener listener; public PopupWindow popWindow; private View rootView; private boolean scroll = false; private void init() { initListView(); initPopupWindow(); } public NIMPopupMenu(Context context, List<PopupMenuItem> items, MenuItemClickListener listener) { this.context = context; this.items = items; this.listener = listener; init(); } /** * @param context * @param items * @param listener * @param typeBg */ public NIMPopupMenu(Context context, List<PopupMenuItem> items, MenuItemClickListener listener, int typeBg) { this.context = context; this.items = items; this.listener = listener; this.typeBg = typeBg; init(); } public NIMPopupMenu(Context context, List<PopupMenuItem> items, MenuItemClickListener listener, int typeBg, boolean scroll) { this.context = context; this.items = items; this.listener = listener; this.typeBg = typeBg; this.scroll = scroll; init(); } /** * 初始化列表界面 */ private void initListView() { if (rootView == null) { if (typeBg == TYPE_BG_BLACK) { rootView = LayoutInflater.from(context).inflate(R.layout.nim_popup_menu_black_layout, null); } else { rootView = LayoutInflater.from(context).inflate(R.layout.nim_popup_menu_layout, null); } ListView listView = (ListView) rootView.findViewById(R.id.popmenu_listview); listView.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { if (listener != null) { popWindow.dismiss(); listener.onItemClick(items.get(position)); } } }); adapter = new PopupMenuAdapter(context, items, typeBg); listView.setAdapter(adapter); } rootView.setFocusableInTouchMode(true); rootView.setOnKeyListener(new OnKeyListener() { @Override public boolean onKey(View v, int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_MENU && popWindow.isShowing() && event.getAction() == KeyEvent.ACTION_DOWN) { popWindow.dismiss(); return true; } return false; } }); } @SuppressWarnings("deprecation") private void initPopupWindow() { if (popWindow == null) { //popWindow = new PopupWindow(rootView, LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); popWindow = new PopupWindow(context); popWindow.setContentView(rootView); popWindow.setWidth(WindowManager.LayoutParams.WRAP_CONTENT); if (scroll) { popWindow.setHeight(ScreenUtil.getDisplayHeight() * 2 / 3); } else { popWindow.setHeight(WindowManager.LayoutParams.WRAP_CONTENT); } popWindow.setTouchable(true); popWindow.setBackgroundDrawable(new BitmapDrawable()); // popWindow.setContentView(rootView); //setPopupWindowSize(); // popWindow.setHeight(rootView.getMeasuredHeight()); popWindow.setOnDismissListener(new OnDismissListener() { @Override public void onDismiss() { } }); } } private void setPopupWindowSize() { // popWindow.setContentView(rootView); rootView.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT)); rootView.measure(View.MeasureSpec.UNSPECIFIED, View.MeasureSpec.UNSPECIFIED); popWindow.setWidth(rootView.getMeasuredWidth() + ScreenUtil.dip2px(15)); // popWindow.setHeight(rootView.getMeasuredHeight()); popWindow.update(); } public void notifyData() { adapter.notifyDataSetChanged(); } public void show(View v) { if (popWindow == null) { return; } if (popWindow.isShowing()) { popWindow.dismiss(); } else { //setPopupWindowSize(); if (scroll) {// 当可以滚动时,横竖屏切换时,重新确定高度 Configuration configuration = context.getResources().getConfiguration(); int ori = configuration.orientation; if (ori == Configuration.ORIENTATION_LANDSCAPE) { popWindow.setHeight(ScreenUtil.getDialogWidth() * 2 / 3); } else { popWindow.setHeight(ScreenUtil.getDisplayHeight() * 2 / 3); } } popWindow.setFocusable(true); popWindow.showAsDropDown(v, -10, 0); } } public boolean isShowing() { return popWindow != null && popWindow.isShowing(); } public void dissmiss() { if (isShowing()) popWindow.dismiss(); } public abstract interface MenuItemClickListener { public void onItemClick(PopupMenuItem item); } }