您的位置:首页 > 运维架构

关于自定义PopupWindow里面视图的控制

2016-05-21 15:51 316 查看
需求这里不再赘述,就是一个popupwindow,出来之后里面的视图要分情况控制。

一开始,代码就是这么写的:

final View view = inflate(R.layout.popupwindow_menu_home);

if (menuPop == null) {
menuPop = new PopupWindow(view,
ViewGroup.LayoutParams.WRAP_CONTENT,
ViewGroup.LayoutParams.WRAP_CONTENT, true);
menuPop.setOutsideTouchable(true);
menuPop.setAnimationStyle(R.style.menuAnimation);
menuPop.setBackgroundDrawable(new BitmapDrawable());
menuPop.setOnDismissListener(new PopupWindow.OnDismissListener() {
@Override
public void onDismiss() {

}
});
}

if (!menuPop.isShowing()) {
menuPop.showAsDropDown(v,v.getWidth(),-(7*v.getHeight())/4);
}


各种判断,这也算是常见的了,一般都会这么写吧。但是问题就出在这里。

第一次出现时,view与popupwindow都会初始化,这时候去控制view里面的控件,没有任何问题,但是点击屏幕popupwindow消失,第二次出现时,view里面的控件监听都会执行,就是之前隐藏的textview,现在不显示。通过日志显示,textview的各种属性都在,能获取到,而且都正常,但就是不显示。

想了好久后来想通了,问题就出现在 if (menuPop == null) { },这一条判断。

我的第二次出现popupwindow是将前面列出来的整个代码都执行一次,因为是写在一个方法里的。

也正是因为如此,第一次出现时:

view初始化,popupwindow初始化,并显示;

第二次出现时,这个时候就有问题了,

view还是会初始化,但是popupwindow已经经过一次初始化,这个时候它是有实例的,他不会在去初始化,于是就出现了这个情况:

显示的是第一次的popupwindow,view也是第一次的view,但是后面要控制的,就是日志里看属性的textview却是第二次实例化的。


这个问题是后来才想明白的,也的确是这样,既然知道了问题,相应的改动就简单了。要么不做判断,或者popupwindow不做全局变量,要么在dismiss时把popupwindow置空。问题自然就解决了。

平时多想想还是有作用的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: