findViewById(R.id.btn).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
showPopupWindow(v);
}
});
private void showPopupWindow(View v) {
View converView = LayoutInflater.from(this).inflate(R.layout.popup, null);
Button b = (Button) converView.findViewById(R.id.b);
converView.setFocusable(true);//很关键
converView.setFocusableInTouchMode(true);
b.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(MainActivity.this, "click", Toast.LENGTH_SHORT).show();
}
});
final PopupWindow win = new PopupWindow(converView, RelativeLayout.LayoutParams.MATCH_PARENT, RelativeLayout.LayoutParams.WRAP_CONTENT, true);//此处要设置PopupWindow的Focusable为true
converView.setOnKeyListener(new View.OnKeyListener() {
@Override
public boolean onKey(View v, int keyCode, KeyEvent event) {
if(keyCode == KeyEvent.KEYCODE_BACK){
win.dismiss();
return true;
}
return false;
}
});
win.setTouchable(true);
win.setOutsideTouchable(false);
win.showAtLocation(v, Gravity.BOTTOM, 0, 0);
}
实现了 点击空白弹窗不会消失,只有按返回键才会消失。
如果想要点击空白也消失 可是设置:win.setBackgroundDrawable(new ColorDrawable(0x00000000));
实现当弹窗出现屏幕变暗的效果
//添加一个设置屏幕透明度的方法
private void backgroundAlpha(float a) {
WindowManager.LayoutParams lp = getWindow().getAttributes();
lp.alpha = a;
getWindow().setAttributes(lp);
}
//此方法监听弹窗消失的时候,将透明度还原
backgroundAlpha(0.5f);
pw.setOnDismissListener(new PopupWindow.OnDismissListener() {
@Override
public void onDismiss() {
backgroundAlpha(1f);
}
});
//可以得到view在整个屏幕的坐标 location[0]为X轴 location[1]为Y轴
int[] location = new int[2];
v.getLocationOnScreen(location);