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

在使用PopupWindow时遇到视图控制的问题,即第二次显示时已隐藏的TextView不再显示。问题出在对PopupWindow是否为空的判断上,由于第二次显示时PopupWindow已有实例,导致视图未重新初始化。解决方案包括移除判断、不使用全局变量或在dismiss时置空PopupWindow。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

需求这里不再赘述,就是一个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置空。问题自然就解决了。

平时多想想还是有作用的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值