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

来源:互联网 发布:淘宝o2o平台 编辑:程序博客网 时间:2024/04/30 16:22

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
原创粉丝点击