示例:
方法调用:
private void showPopWindow() {
List<XinPopWindow.MenuItem> menuItems = new ArrayList<>();
menuItems.add(new XinPopWindow.MenuItem("拍摄", 1));
menuItems.add(new XinPopWindow.MenuItem("拍照", 2));
final XinPopWindow mPopUpload = new XinPopWindow(this);
mPopUpload.setData(menuItems);
mPopUpload.showAtLocation(findViewById(R.id.root), Gravity.BOTTOM, 0, 0);
mPopUpload.setOnItemClickListener(new XinPopWindow.OnItemClickListener() {
@Override
public void onItemClick( View view, int position, int type) {
mPopUpload.dismiss();
switch (type) {
case 1:
Toast.makeText(MainActivity.this, "拍摄", Toast.LENGTH_LONG).show();
break;
case 2:
Toast.makeText(MainActivity.this, "拍照", Toast.LENGTH_LONG).show();
break;
}
}
});
}
源码:
package com.net.popwindow;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.Context;
import android.support.annotation.NonNull;
import android.support.v4.content.ContextCompat;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.view.Window;
import android.view.WindowManager;
import android.widget.PopupWindow;
import android.widget.TextView;
import java.util.ArrayList;
import java.util.List;
public class XinPopWindow extends PopupWindow {
private static OnItemClickListener mOnItemClickListener;
private Activity mContext;
private Window mWindow;
private RecyclerView mItems;
private static MenuAdapter menuAdapter;
XinPopWindow(Activity context) {
mContext = context;
mWindow = mContext.getWindow();
restoreBackgroundAlpha();
LayoutInflater inflater =
(LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
@SuppressLint("InflateParams") View mMenuView = inflater.inflate(R.layout.common_popwindow, null, false);
View btnCancel = mMenuView.findViewById(R.id.btn_cancel);
btnCancel.setOnClickListener(
new View.OnClickListener() {
@Override
public void onClick(View v) {
dismiss();
}
});
mItems = mMenuView.findViewById(R.id.itemList);
mItems.setLayoutManager(new LinearLayoutManager(mContext));
menuAdapter = new MenuAdapter();
mItems.setAdapter(menuAdapter);
mMenuView.setOnTouchListener(
new View.OnTouchListener() {
@SuppressLint("ClickableViewAccessibility")
@Override
public boolean onTouch(View v, MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_UP || event.getY() < mItems.getTop())
XinPopWindow.this.dismiss();
return true;
}
});
setOutsideTouchable(true);
this.setFocusable(true);
this.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);
this.setWidth(WindowManager.LayoutParams.MATCH_PARENT);
this.setHeight(WindowManager.LayoutParams.MATCH_PARENT);
this.setContentView(mMenuView);
setBackgroundDrawable(
ContextCompat.getDrawable(mContext.getApplication(), android.R.color.transparent));
this.setAnimationStyle(R.style.common_PopupAnimation);
setOnDismissListener(
new OnDismissListener() {
@Override
public void onDismiss() {
restoreBackgroundAlpha();
}
});
}
private void backgroundAlpha(float bgAlpha) {
if (mWindow == null) {
mWindow = mContext.getWindow();
}
if (mWindow == null) return;
WindowManager.LayoutParams lp = mWindow.getAttributes();
mWindow.addFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND);
lp.alpha = bgAlpha; // 0.0-1.0
mWindow.setAttributes(lp);
}
private void restoreBackgroundAlpha() {
if (mWindow == null) {
mWindow = mContext.getWindow();
}
if (mWindow == null) return;
mWindow.clearFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND);
WindowManager.LayoutParams lp = mWindow.getAttributes();
lp.alpha = 1;
mWindow.setAttributes(lp);
}
@Override
public void showAtLocation(View parent, int gravity, int x, int y) {
super.showAtLocation(parent, gravity, x, y);
backgroundAlpha(0.6f);
}
void setData(List<MenuItem> menuItems) {
menuAdapter.setMenuItems(menuItems);
}
void setOnItemClickListener(final OnItemClickListener listener) {
mOnItemClickListener = listener;
}
/ 事件监听
public interface OnItemClickListener {
void onItemClick(View view, int position, int type);
}
public static class MenuAdapter extends RecyclerView.Adapter<MenuAdapter.RVViewHolder> {
List<MenuItem> menuItems;
MenuAdapter() {
menuItems = new ArrayList<>();
}
@NonNull
@Override
public RVViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
@SuppressLint("InflateParams") View view = LayoutInflater.from(viewGroup.getContext())
.inflate(R.layout.common_item_popup_bottom, viewGroup, false);
return new RVViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull RVViewHolder holder, int position) {
final int pos = position;
holder.btn.setText(menuItems.get(position).name);
if (position == 0) {
holder.btn.setBackgroundResource(R.drawable.common_btn_pop_choose_pic_up);
} else {
holder.btn.setBackgroundResource(R.drawable.common_btn_pop_choose_pic_mid);
}
if (position == menuItems.size() - 1) {
holder.line.setVisibility(View.GONE);
} else {
holder.line.setVisibility(View.VISIBLE);
}
holder.btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (mOnItemClickListener != null)
mOnItemClickListener.onItemClick(
view, pos, menuItems.get(pos).type);
}
});
}
@Override
public int getItemCount() {
return menuItems.size();
}
private static class RVViewHolder extends RecyclerView.ViewHolder {
TextView btn;
View line;
RVViewHolder(@NonNull View itemView) {
super(itemView);
btn = itemView.findViewById(R.id.btn_);
line = itemView.findViewById(R.id.line_);
}
}
void setMenuItems(List<MenuItem> menuItems) {
this.menuItems = menuItems;
notifyDataSetChanged();
}
}
public static class MenuItem {
String name;
int type;
MenuItem(String name, int type) {
this.name = name;
this.type = type;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof MenuItem)) return false;
MenuItem menuItem = (MenuItem) o;
return type == menuItem.type
&& (name != null ? name.equals(menuItem.name) : menuItem.name == null);
}
@Override
public int hashCode() {
int result = name != null ? name.hashCode() : 0;
result = 31 * result + type;
return result;
}
}
}