android开发之popupwindow的使用及细节

原创 2017年05月11日 17:10:05

android开发之popupwindow的使用及细节

  • 初始化
  • 显示
  • 隐藏
  • 使用细节

popupwindow的初始化

public void initDanmuPop() {
        // 一个自定义的布局,作为显示的内容
        View contentView = LayoutInflater.from(this).inflate(R.layout.chat_danmu, null);

        popupWindow = new PopupWindow(contentView, LinearLayout.LayoutParams.MATCH_PARENT, DensityUtil.dip2px(this,48f), true);
        popupWindow.setTouchable(true);  //控制是否可点击
        popupWindow.setFocusable(true);   //控制是否聚焦,能否响应点击事件的关键
        //是否可点击外部取消
        //为true时,必须要设置背景才会生效;为false时,必须不设置背景才会生效
        popupWindow.setOutsideTouchable(true);  
        popupWindow.setTouchInterceptor(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                return false;
            }
        });

        popupWindow.setSoftInputMode(PopupWindow.INPUT_METHOD_NEEDED);
        //软键盘不会挡着popupwindow
        popupWindow.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);
        // 如果不设置PopupWindow的背景,无论是点击外部区域还是Back键都无法dismiss弹框
        popupWindow.setBackgroundDrawable(new BitmapDrawable());  
        //内部控件初始化
        ivShortcut = (ImageView) contentView.findViewById(R.id.iv_shortcut);
        ivSend = (ImageView) contentView.findViewById(R.id.iv_send);
        ivCancel = (ImageView) contentView.findViewById(R.id.iv_cancel);
        etDanmu = (EditText) contentView.findViewById(R.id.et_danmu);
        tvEdit = (TextView) contentView.findViewById(R.id.tv_edit);
        slvShortcut = (SliderListView) contentView.findViewById(R.id.slv_shortcuts);
        llShortcut = (LinearLayout) contentView.findViewById(R.id.ll_shortcut);


        //消失监听
        popupWindow.setOnDismissListener(new PopupWindow.OnDismissListener() {
            @Override
            public void onDismiss() {

            }
        });
    }

popupwindow的显示

1、相对某个控件的位置(正左下方),无偏移
popupWindow.showAsDropDown(view);

2、相对某个控件的位置(正左下方),有偏移
popupWindow.showAsDropDown(mTv, width, 0);//设置x轴偏移量:注意单位为px

3、 相对于父控件的位置,无偏移~参数1为父容器~参数2为相对父容器相对类型~参数3、4为偏移量
popupWindow.showAtLocation(parentView, Gravity.CENTER, 0, 0);

4、相对于父控件的位置,有偏移~参数1为父容器~参数2为相对父容器相对类型~参数34为偏移量
popupWindow.showAtLocation(parentView, Gravity.BOTTOM, 20, 20);

popupwindow的隐藏

if (mPopupWindow != null && mPopupWindow.isShowing()) {  
    mPopupWindow.dismiss();  
}  

细节部分

1、在屏幕下方不被系统键盘遮挡的处理 
//获取焦点
popupWindow.setFocusable(true);
//设置不被系统键盘遮挡
popupWindow.setInputMethodMode(PopupWindow.INPUT_METHOD_NEEDED); popupWindow.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);
//弹出键盘时会被顶起
popupWindow.showAtLocation(parentView, Gravity.BOTTOM | Gravity.CENTER_VERTICAL, 0, 0);

2、内部有EditText自动获取焦点的情况
在EditText父容器内加上下面两行代码
android:focusable=”true”
android:focusableInTouchMode=”true”
目的是让父容器得到焦点,从而使Edittext失去焦点

3、update方法的使用
在使用弹窗的过程中,经常会遇到需要改变弹窗显示大小的情况,可以使用弹窗自带的update(int width,int heigth)方法即可达到这一效果,而不需关闭弹窗在打开。

4、点击外部区域,弹窗不消失,但是点击事件会向下面的activity传递
在工具类中写上下面这个方法:
UIUtils.setPopupWindowTouchModal(popupWindow, false);

 public static void setPopupWindowTouchModal(PopupWindow popupWindow,
            boolean touchModal) {
        if (null == popupWindow) {
            return;
        }
        Method method;
        try {
            //运用的反射原理
            method = PopupWindow.class.getDeclaredMethod("setTouchModal",
                    boolean.class);
            method.setAccessible(true);
            method.invoke(popupWindow, touchModal);
        }
        catch (Exception e) {
            e.printStackTrace();
        }
    }

再在程序中调用:
UIUtils.setPopupWindowTouchModal(popupWindow, false);

这样即可实现在弹窗不消失的情况下该popupWindow外部的事件传递给下面的Activity了。

程序猿之---C语言细节10(++操作很可能你会出错)

主要内容:++操作细节 #include int main(int argc, char** argv) { int t1 = 2, t2 = 0; //t2 ...
  • wujunbo27
  • wujunbo27
  • 2014年11月06日 22:35
  • 810

【Android UI设计与开发】6.底部菜单栏(三)使用Fragment+PopupWindow仿QQ空间最新版底部菜单栏

直接看栗子吧,效果基本实现,界面微调和弹窗的优化,去做的话会很耗时说,暂时就酱紫了。上传效果动态图太大了,直接手机截图的效果图如下:   至于代码的实现主要就是自定义的菜单栏,和用 Popup...
  • mypanlong
  • mypanlong
  • 2015年05月15日 08:02
  • 990

PopupWindow中使用EditText软键盘的弹出和隐藏

1.解决软键盘的弹出会挡住PopupWindow的问题。//防止PopupWindow被软件盘挡住 popupWindoew.setSoftInputMode(PopupWindow.INPUT_ME...
  • android_hl
  • android_hl
  • 2016年06月26日 11:52
  • 6835

程序猿之---C语言细节12(指针和数组细节,"//"的可移植性说明)

主要内容:指针和数组细节,"//"的可移植性说明 #include int main(int argc, char **argv) { int a[10]={1,2,3,4,5,6,7,8,9,...
  • wujunbo27
  • wujunbo27
  • 2014年11月07日 18:17
  • 759

Android popupwindow的简单使用

先看下效果 1.首页package com.yskj.jh.demopopupwindow;import android.content.Context; import android.graphi...
  • JH_Manny
  • JH_Manny
  • 2016年11月09日 16:17
  • 189

底部菜单栏之Fragment+PopupWindow实现

转自:http://blog.csdn.net/yangyu20121224/article/details/9023451  在今天的这篇文章当中,我依然会以实战加理论结合的方式教大家如何设计...
  • zhouboyu
  • zhouboyu
  • 2016年05月08日 03:06
  • 2654

android中实现PopupWindow跟随ProgressBar进度显示

android中实现PopupWindow跟随ProgressBar进度显示
  • LZ511321
  • LZ511321
  • 2017年04月09日 13:47
  • 447

PopupWindow无法全屏显示

在tagetSdkVersion为21的情况下,PopupWindow可以全屏显示正常。但是当tagetSdkVersion改为23时无法全屏显示,顶部的状态栏无法覆盖。这个情况下加一个语句可以解决:...
  • tomatomas
  • tomatomas
  • 2016年06月17日 13:46
  • 3679

android开发之popupwindow半透明

概要 在android开发时我们经常需要制作如下的界面,半透明的效果使得界面看上去整齐美观晶莹剔透=w= 这篇博客将介绍如何做出这样的界面 代码部分 想要实现这种半透明效果要实...
  • baidu_25537855
  • baidu_25537855
  • 2016年02月19日 13:15
  • 332

Android开发之 popupwindow

popupwindow是啥? popupwindow是一种弹窗式控件,一个非常好实用的控件。。。。。 下面是具体实现的代码,而popupwindow在网上也有详解。。package...
  • qq_37061799
  • qq_37061799
  • 2017年07月08日 19:52
  • 186
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:android开发之popupwindow的使用及细节
举报原因:
原因补充:

(最多只允许输入30个字)