使用 PopupWindow 自定义对话框遭遇的悲催事件和解决方法

PopupWindow 类的构造方法有:

public RoundSelectPopupWindow() //据说在2.2的模拟器上会报错,为兼容性考虑建议不要使用

public RoundSelectPopupWindow(Context context) 

public RoundSelectPopupWindow(Context context, AttributeSet attrs,int defStyleAttr, int defStyleRes) 

public RoundSelectPopupWindow(Context context, AttributeSet attrs,int defStyleAttr) 

public RoundSelectPopupWindow(Context context, AttributeSet attrs) 

public RoundSelectPopupWindow(int width, int height) 

public RoundSelectPopupWindow(View contentView) 

public RoundSelectPopupWindow(View contentView, int width, int height,boolean focusable) 

public RoundSelectPopupWindow(View contentView, int width, int height)

其中,

1、int width, int height 可以通过LayoutParams.MATCH_PARENT,
LayoutParams.WRAP_CONTENT 或LayoutParams.FILL_PARENT(已过时) 来设置为充满还是包裹内容。 
(遭遇:…伤害999…看不见,看不见)


    2、contentView 要设置为此 popupWindow 的布局文件。即  View contentView = findViewById( R.layout.xxx ); 假若此popupWindow 的全部内容其实是在布局文件的子布局中完成的,不建议使用 findViewById( R.id.xxx )的方式获取子布局,并设为contentView,否则可能导致自定义 popupWindow 失效或不显示。

(遭遇:…掉装惨重…做成demo移到其他项目居然就不灵光了)

3、popupWindow 设置获取焦点的资格,否则其可能无法响应进行监听事件
popupWindow.setFocusable(true); // 设置PopupWindow可获得焦点
popupWindow.setTouchable(true);// 设置PopupWindow可触摸

(遭遇:…掉蓝惨重…监听总是不成)

4、使用java代码设置背景,例如:popupWindow.setBackgroundDrawable(getWallpaper());//获取壁纸,实际上没有获取,只获得一片黑暗。

只使用xml在layout根节点设置背景,而不使用代码设置背景可能出现乱七八糟的问题。可能出现的问题是无法响应此popupWindow中定义的某些事件,或者无法设置全屏,屏幕的边框总是存在一两条空隙。
(遭遇…掉红惨重…无法设置真正全屏,通过java代码设置后成功,即便是设置透明度)

5、设置 popupWindow 可见。如:popupWindow.showAsDropDown(View view); 那么实例化后,popupWindow将在view的下方。

(遭遇:…智力下降…不能看到popupWindow)

6、监听 pupupWindow 中的控件时,使用类名直接实现 pupupWindow 的listener接口,即:public class RoundSelectPopupWindow extends PopupWindow implements OnClickListener{}无反应。可能原因,焦点问题;忘记在构造方法中设置监听:view.setOnClickListener(this);使用switch case判断view的id;使用if直接判断view == view。

(遭遇:…眩晕…监听无效,监听无效,删代码,删代码)

附图:

全屏悲剧图

修复后代码:

PopupWindow popupWindow = new RoundSelectPopupWindow(MainActivity.this, contentView);
            popupWindow.setContentView(contentView);
            popupWindow.setWidth(LayoutParams.MATCH_PARENT);
            popupWindow.setHeight(LayoutParams.MATCH_PARENT);
            popupWindow.setBackgroundDrawable(new ColorDrawable(Color.alpha(50)));

            popupWindow.setFocusable(true); // 设置PopupWindow可获得焦点
            popupWindow.setTouchable(true);// 设置PopupWindow可触摸
            popupWindow.setOutsideTouchable(true);
//          popupWindow.showAsDropDown(titlebar);
            popupWindow.showAtLocation(titlebar,Gravity.CENTER,0, 0);

ok,正常。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值