android popuwindow点击外部窗口不消失的实例

网上大多数都是说如何监听点击外部消失,但我遇到的问题是点击外面不让其消失,如下是我的解决方案,关键是:popupMenu.setBackgroundDrawable(null);popupMenu.setFocusable(false);

popupMenu = new PopupWindow(view, keylinearlayout.getWidth(), LayoutParams.WRAP_CONTENT);

 ColorDrawable cd = new ColorDrawable(R.color.white);
 //popupMenu.setBackgroundDrawable(cd);
 popupMenu.setBackgroundDrawable(null);
 popupMenu.setAnimationStyle(R.style.AnimBottom);
 popupMenu.update();
 popupMenu.setInputMethodMode(PopupWindow.INPUT_METHOD_NEEDED);
 popupMenu.setTouchable(true); // 设置popupwindow可点击
 popupMenu.setOutsideTouchable(false); // 设置popupwindow外部可点击
 popupMenu.setFocusable(false); // 获取焦点

 popupMenu.setTouchInterceptor(new View.OnTouchListener() {

  @Override
  public boolean onTouch(View v, MotionEvent event) {
  // 如果点击了popupwindow的外部,popupwindow也会消失
  // 这里如果返回true的话,touch事件将被拦截
  // 拦截后 PopupWindow的onTouchEvent不被调用,这样点击外部区域无法dismiss
  if (event.getAction() == MotionEvent.ACTION_OUTSIDE) {
   //popupMenu.dismiss();
   StationEventCaptain.getInstance().fireEventDataChange(
    new StationEventData(IStationEventName.HEDGE_KEYBORAD_DIMISS, true));
   return true;
  }
  return false;
  }
 });

 //初始化键盘上的数字
 initALLDig(view);
 }

 @Override
 public PopupWindow createPupupWindow() {
 return popupMenu;
 }

 @Override
 public void showPopupMenu() {
 if (popupMenu != null && popupMenu.isShowing()) {
  popupMenu.dismiss();
  StationEventCaptain.getInstance().fireEventDataChange(
   new StationEventData(IStationEventName.HEDGE_KEYBORAD_DIMISS, true));
 } else {
  //popupMenu.showAsDropDown(sourceEditView);

  int pianyi = dpToPx(activity, 8);
  if (keyboardType == IPopupMenu.MENU_TYPE_HEDGE_Left) {
  popupMenu.showAtLocation(keylinearlayout, Gravity.BOTTOM | Gravity.LEFT, pianyi, 0); //设置layout在PopupWindow中显示的位置
  } else if (keyboardType == IPopupMenu.MENU_TYPE_HEDGE_RIGHT) {
  popupMenu.showAtLocation(keylinearlayout, Gravity.BOTTOM | Gravity.RIGHT, pianyi, 0); //设置layout在PopupWindow中显示的位置
  } else {
  popupMenu.showAtLocation(keylinearlayout, Gravity.BOTTOM | Gravity.LEFT, 0, 0); //设置layout在PopupWindow中显示的位置
  }

  // popupMenu.showAsDropDown(sourceView,
  // Math.round(sourceView.getX()),
  // (int) (sourceView.getY()));
 }
 }

 /**
 * 将dp转成像素的
 *
 * @param context
 * @param dp
 * @return
 */
 static int dpToPx(final Context context, final float dp) {
 return (int) (dp * context.getResources().getDisplayMetrics().density);
 }

 @Override
 public void destroyPopupMenu() {
 popupMenu.dismiss();
 StationEventCaptain.getInstance()
  .fireEventDataChange(new StationEventData(IStationEventName.HEDGE_KEYBORAD_DIMISS, true));

 }

成功解决,有问题可以讨论。

以上这篇android popuwindow点击外部窗口不消失的实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • Android7.0上某些PopuWindow出现显示位置不正确问题的解决方法

    本文实例讲述了Android7.0上某些PopuWindow出现显示位置不正确问题的解决方法.分享给大家供大家参考,具体如下: 情景描述: 在andorid7.0及以上系统,点击某个view,本来期待有一个Popuwindow在该view下面弹出(调用PopuWindow.showAsDropDown(view)方法)但结果PopuWindow却弹出在view上方,顶在系统状态栏下面. 原因分析: 在android7.0上,如果不主动约束PopuWindow的大小,比如,设置布局大小为 MATC

  • Android SDK三种更新失败及其解决方法

    最近在网上看Moto 360的图片,真是帅,帅了又帅,比帅更帅.所以想研究下Android wear. 更新Android SDK,居然失败了三次. 1.第一次失败 出现Failed to fetch URL错误提示 Failed to fetch URL https://dl-ssl.google.com/android/repository/repository-6.xml, reason: Connection to https://dl-ssl.google.com refused Fa

  • Android adb.exe程序启动不起来 具体解决方法

    经常遇到 Please ensure that adb is correctly located at 'D:\java\sdk\platform-tools\adb.exe' and can be executed. 遇到问题描述: 运行android程序控制台输出 [2012-07-18 16:18:26 - ] The connection to adb is down, and a severe error has occured.    [2012-07-18 16:18:26 - ]

  • Android圆形头像拍照后“无法加载此图片”的问题解决方法(适配Android7.0)

    Feature: 点击选择拍照或者打开相册,选取图片进行裁剪最后设置为圆形头像. Problem: 拍好照片,点击裁剪,弹Toast"无法加载此图片". Solution: 在裁剪的class里加两行代码 intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); intent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION); 主要代码如下: public static final S

  • 基于Android中实现定时器的3种解决方法

    在Android开发中,定时器一般有以下3种实现方法:一.采用Handler与线程的sleep(long)方法二.采用Handler的postDelayed(Runnable, long)方法三.采用Handler与timer及TimerTask结合的方法下面逐一介绍:一.采用Handle与线程的sleep(long)方法Handler主要用来处理接受到的消息.这只是最主要的方法,当然Handler里还有其他的方法供实现,有兴趣的可以去查API,这里不过多解释.1. 定义一个Handler类,用

  • Android Activity切换(跳转)时出现黑屏的解决方法 分享

    在两个Activity跳转时,由于第二个Activity在启动时加载了较多数据,就会在启动之前出现一个短暂的黑屏时间,解决这个问题比较简单的处理方法是将第二个Activity的主题设置成透明的,这样在启动第二个Activity时的黑屏就变成了显示第一个Activity界面.这个分两步完成:第一步:xxx/res/values/styles.xml中加入自定义Activity的Theme,如下所示: [html]  <style name="Transparent" parent=

  • Android7.0 MessageQueue详解

    Android中的消息处理机制大量依赖于Handler.每个Handler都有对应的Looper,用于不断地从对应的MessageQueue中取出消息处理. 一直以来,觉得MessageQueue应该是Java层的抽象,然而事实上MessageQueue的主要部分在Native层中. 自己对MessageQueue在Native层的工作不太熟悉,借此机会分析一下. 一.MessageQueue的创建 当需要使用Looper时,我们会调用Looper的prepare函数: public stati

  • Android中PopuWindow实现下拉列表实例

    前言 之前讲过一篇关于PopuWindow的基本使用的文章,想了解的同学可以参考:PopupWindow的基本使用 其实,下拉列表Spanner(不知道控件拼写是否正确)就能实现,但是基于ui美化方面的考虑,用popuwindow实现是一个不错的选择,今天就来讲讲PopuWindow实现下拉列表的具体实现吧. 正文 文章可能会有点长,大家将就着看吧.先上波效果图才是厚道的: 下面开始正式讲解. 基础依赖,由于下拉列表是用RecycleView实现,然后控件初始化用到ButterKnife,所以要

  • Android7.0 工具类:DiffUtil详解

    一 概述 DiffUtil是support-v7:24.2.0中的新工具类,它用来比较两个数据集,寻找出旧数据集->新数据集的最小变化量. 说到数据集,相信大家知道它是和谁相关的了,就是我的最爱,RecyclerView. 就我使用的这几天来看,它最大的用处就是在RecyclerView刷新时,不再无脑mAdapter.notifyDataSetChanged(). 以前无脑mAdapter.notifyDataSetChanged()有两个缺点: 1.不会触发RecyclerView的动画(删

  • Android Studio的中文乱码问题解决方法

    Android Studio安装后发现所有的中文,不管是界面上的还是输出的log中的中文都变成小框框  可以肯定是字体的问题 解决:菜单File->settings对话框,切换到Appearance标签  选择override default fonts by, 先随便选择一个中文字体(PS:小框框都是中文字 呵呵),保存,重启软件,即可.

  • 适配android7.0获取文件的Uri的方法

    前言# Android 7.0已经发布很久了,虽然市场份额还不是很高,但是流行起来都是早晚的事,所以适配Android 7.0刻不容缓. Android 7.0 对系统进行了很多的优化:例如文件访问权限,省电,网络,后台等等,其中最突出的就是应用外的Uri访问. 什么时候会用到Uri的应用外访问呢?举一个简单的例子,下载apk更新,这个时候会调用系统功能来安装这个apk,这就是应用外访问文件,需要传入文件的Uri. 但是这样可能会显得不太安全,万一是什么非常重要的文件就糟糕了,所以Android

随机推荐