资料来源
https://blog.csdn.net/a379992210/article/details/48423923
https://blog.csdn.net/shanxuyang/article/details/47068487
popMenu
popMenu实现在某个view的上方或者下方显示一个折叠的系统风格的折叠菜单,向上还是向下弹出由系统控制(下方有空间从下方弹出,下方没有空间从上方弹出)
//初始化按钮
mPopMenuBtn = (Button) findViewById(R.id.button3);
//为按钮注册点击事件
public void popMenuBtnOnClick(View view) {
//新建一个popMenu实例
mPopMenu = new PopupMenu(this, mPopMenuBtn);
//为这个实例的menu加载布局资源
mPopMenu.getMenuInflater().inflate(R.menu.menu_popup_window, mPopMenu.getMenu());
mPopMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem item) {
//do something
return true;
}
});
mPopMenu.show();
}
popWindow
与popMenu类似
但是默认实现是点击控件后,在控件下方显示一个窗口,这个窗口可以指定大小以及显示位置,但是不能像popMenu一样自动调整从上方还是下方弹出
另外,popWindow与AlertDialog的区别
最关键的区别是AlertDialog不能指定显示位置,只能默认显示在屏幕最中间(当然也可以通过设置WindowManager参数来改变位置)。而PopupWindow是可以指定显示位置的,随便哪个位置都可以,更加灵活。(引用https://blog.csdn.net/harvic880925/article/details/49272285)
下面简单实现一个popWindow() 实现mPopWindowBtn的下拉菜单效果
//初始化按钮
mPopWindowBtn = (Button) findViewById(R.id.button4);
public void popWindowBtnOnClick(View view) {
//通过布局文件获取一个View
mPopWindowView = getLayoutInflater().inflate(R.layout.dialog_layout, null);
//新建一个window,为这个window填充视图,指定宽度高度,指定是否可以点击
// Focusable 为True,PopupWindow的点击事件才会相应
mPopWindow = new PopupWindow(mPopWindowView, WindowManager.LayoutParams.MATCH_PARENT, WindowManager.LayoutParams.WRAP_CONTENT, true);
//为窗口中的控件注册点击事件
TextView choosePhoto = (TextView) mPopWindowView.findViewById(R.id.choosePhoto);
TextView takePhoto = (TextView) mPopWindowView.findViewById(R.id.takePhoto);
choosePhoto.setOnClickListener(this);
takePhoto.setOnClickListener(this);
//控制窗口弹出位置
//showAsDropDown,作为下拉菜单.showAtLocation(),选择弹出位置.
mPopWindow.showAsDropDown(mPopWindowBtn);
}
@Override
public void onClick(View view) {
switch (view.getId()){
case R.id.takePhoto:
Toast.makeText(this,"点击了拍照",Toast.LENGTH_SHORT).show();
Log.i(TAG, "onClick: v.getId="+view.getId());
break;
case R.id.choosePhoto:
Toast.makeText(this,"点击了从相册选择",Toast.LENGTH_SHORT).show();
Log.i(TAG, "onClick: v.getId="+view.getId());
break;
}
//关闭窗口
mPopWindow.dismiss();
}
如果想要控制window弹出的位置
可以通过showAtLocation()来控制
注意窗口中的点击事件需要自己注册,没有类似于popMenu自己的监听器
默认popWindow点击back和外部控件,会先关闭窗口,需要再次点击back和外部控件才能触发相应的点击事件
如果需要popWindow既能响应back和外部控件点击关闭窗口,又能同时触发外部控件的点击事件
可以这样设置
popupWindow.setFocusable(false);
popupWindow.setOutsideTouchable(true);