资料来源

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() {@Overridepublic boolean onMenuItemClick(MenuItem item) {//do somethingreturn true;}});mPopMenu.show();}

popWindow

模板代码

 private PopupWindow popupWindow;@SuppressLint("InflateParams") View     view=LayoutInflater.from(this).inflate(R.layout.pop_window_work_reporte,null);
//初始化popWindowpopupWindow=new PopupWindow(view,ViewGroup.LayoutParams.WRAP_CONTENT,ViewGroup.LayoutParams.WRAP_CONTENT,false);
//让popWindow响应点击背景时可以dismisspopupWindow.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));popupWindow.setOutsideTouchable(true);
//注册popWindow消失监听popupWindow.setOnDismissListener(new PopupWindow.OnDismissListener() {@Overridepublic void onDismiss() {//do someThing}});

与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) {
//通过布局文件获取一个ViewmPopWindowView = 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);}@Overridepublic 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()来控制

例如,让窗口在actionbar的右下角弹出

int height=layoutActionbar.getHeight() ;
popWindow.showAtLocation(layoutActionbar, Gravity.END| Gravity.TOP,0,height);

高度和宽度是像素值,控件的高度宽度

获取控件高度宽度 https://blog.csdn.net/CodeIsPoisonous/article/details/54316025

像素转换https://www.cnblogs.com/strinkbug/p/5780910.html

showanlocation的一个小bug

参数,x,y,偏移量为0的时候,没有问题,显示在xml的布局右上角

但是 参考 https://segmentfault.com/q/1010000004319065?sort=created

y增加偏移量的时候,发现距离对不上,上文需要添加50像素

其实我猜测,增加偏移量以后,系统设置的偏移量是根据的手机屏幕的右上角或者左上角为原点,而不是我们定义的xml框架的左上角右上角.手机屏幕的上边会有电源信号的状态栏,增加的这50其实就是状态栏的高度

假设状态栏高度为50,如果我们把y偏移量改为49或者任意小于50的数字,发现与0等同.

获取状态栏高度   https://blog.csdn.net/w_kahn/article/details/50684436

private int getStatusBarHeight(Context context) {int result = 0;int resourceId = context.getResources().getIdentifier("status_bar_height", "dimen", "android");if (resourceId > 0) {result = context.getResources().getDimensionPixelSize(resourceId);}return result;
}

当状态栏不存在的时候会返回0;

窗口中的点击事件需要自己注册,没有类似于popMenu自己的监听器

默认popWindow点击back和外部控件,会先关闭窗口,需要再次点击back和外部控件才能触发相应的点击事件

如果需要popWindow既能响应back和外部控件点击关闭窗口,又能同时触发外部控件的点击事件

可以这样设置

popupWindow.setFocusable(false);

popupWindow.setOutsideTouchable(true);

有时候popwindow点击外部区域,不会自动dismiss,需要给window设置背景才有效

popWindowEdit.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));

设置popwindow点击和消失时的背景变暗效果(设置透明度)

private void setBackgroundAlpha(float v) {WindowManager.LayoutParams lp=this.getWindow().getAttributes();lp.alpha=v;getWindow().setAttributes(lp);}

弹出时设置,消失时改回

                setBackgroundAlpha(0.7f);popWindowEdit.setOnDismissListener(new PopupWindow.OnDismissListener() {@Overridepublic void onDismiss() {setBackgroundAlpha(1.0f);}});

模板代码

//点击时显示popWindowcase R.id.cb_selector:if (popMenu == null) {initPopMenu();}popMenu.showAsDropDown(cbSelector);break;//popWindow的初始化
View view=getLayoutInflater().inflate(R.layout.pop_window_review_selector,null,false);popMenu =new PopupWindow(view,ViewGroup.LayoutParams.WRAP_CONTENT,ViewGroup.LayoutParams.WRAP_CONTENT,false);
//        让popWindow支持点击背景消失popMenu.setOutsideTouchable(true);popMenu.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));popMenu.setOnDismissListener(new PopupWindow.OnDismissListener() {@Overridepublic void onDismiss() {//popWindow消失时的逻辑}});
}

popmenu 和popWindow相关推荐

  1. Android Popwindow 使用

    代码如下: private PopupWindow mPopupWindow;tv.setOnClickListener(v -> {if (mPopupWindow != null & ...

  2. Android在初始化时弹出popwindow的方法

    Android中在onCreate()时弹出popwindow,很多人都有过类似的需求吧,但是直接在onCreate()中调用popwindow的showAtLocation()方法是会报异常的,原因 ...

  3. popwindow setFocusable(false) 不消失与弹出软键盘的冰火不容的矛盾

    这是android的bug吗??? 有的手机设置setOutsideTouchAble(false),就可以让其在点击pop区域以外不消失,但是有的手机需要设置setFocusable(false)才 ...

  4. popwindow 焦点问题,物理返回键截获,软键盘监听问题

    首先是setFocusable这个方法,获取焦点:如果不获取焦点,那么popwindow中的控件都没有办法获取焦点和事件响应问题. 如果获取焦点,那么popwindow就会拦截屏幕上的点击触摸事件以及 ...

  5. 使用popwindow制作弹出框与获得焦点弹出软键盘

    如果是声明一各类 public class VideoFilterDialog extends PopupWindow 那么在构造方法中添加: conentView = inflater.inflat ...

  6. Android应用Activity、Dialog、PopWindow、Toast窗体加入机制及源代码分析

    [工匠若水 http://blog.csdn.net/yanbober 转载烦请注明出处.尊重劳动成果] 1 背景 之所以写这一篇博客的原因是由于之前有写过一篇<Android应用setCont ...

  7. PopupWindow 使用详解(二) Popwindow 制作常见花哨效果

    帝都几日降温,终于被撂倒了.but 只要一息尚存就得不断进步!于是,写出 <PopupWindow 使用详解>的第二篇 笔记,先奉上 第一篇链接: <PopupWindow 使用详解 ...

  8. popwindow弹窗

    最近研究popwindow,在这里分享两个自己运行可用的demo,效果图: 图片一的demo虽然点击不是popwindow区域,popwindow会消失,但是这样会抢夺其他控件的焦点(比如你的手机界面 ...

  9. popWindow 根据内容计算高度

    在初始化Popwindow的时候,除了给定contentView还需要给定Window显示的宽和高.所以我们一般在初始化PopWindow给定宽高,都是定死宽和高.而我们最理想的情况下是根据conte ...

  10. android弹出自定义layout菜单,Android:PopWindow — 对Android的底部弹窗、顶部弹窗菜单及自定义界面的使用封装...

    转载请注明出处:http://blog..net/hmyang314/article/details/70613478 PopWindow 对Android的底部弹窗,顶部弹窗菜单及自定义界面的使用封 ...

最新文章

  1. oracle的cols,Oracle cols_as_rows 比对数据
  2. calendar当前时间整点_时间处理相关类
  3. saltstack管理saltstack认证相关
  4. mysql 索引分析工具_Mysql:性能分析以及Explain工具的使用
  5. 洛谷 P1004 方格取数 【多线程DP/四维DP/】
  6. idea 调试技巧1
  7. 第六计 / Explosive City (2004)
  8. webpack中,css中打包背景图,路径报错
  9. python_argparse简介
  10. 无恶意的协议才有效力
  11. c语言电子时钟课程设计报告,模拟电子时钟c语言课程设计设计报告.doc
  12. 白盒测试实验报告模板
  13. Eclipse 安装 yml 编辑器插件
  14. 前端骨架屏终极方案——骨架图
  15. 动态壁纸-软件制作-教程
  16. rpm包与deb包的制作过程
  17. 深度学习实战(4)如何向BERT词汇表中添加token,新增特殊占位符
  18. 转:oracle ocp 指南
  19. php免费利用飞信发送验证码,PHP 使用飞信 API 来发送免费短信
  20. 家庭主夫怎么在今年3月27号的市场中利用金叉死叉进行波段操作

热门文章

  1. 什么是软件质量管理的底层逻辑?
  2. sose会议级别_【2017年整理】计算机领域EI和SCI收录期刊、影响因子及国际会议.doc...
  3. 计算机科技文献中 CAM,计算机辅助设计、制造(CAD、CAM)和《机械制图》 课程的结合、探索与实践研究...
  4. yum install gcc 下载失败有可能是这个原因?
  5. DSP初识-20151111
  6. ASP.NET Core 多线程 异步编程
  7. Cesium视频教程
  8. 用浏览器怎样监控网页内容变化
  9. Pytorch 分布式训练
  10. 如何备份linux磁盘空间,请问怎么备份整个硬盘又快又省空间?