Android中,popupwindow中再调用popupwindow的问题解析

RT,Android中,popupwindow中再调用popupwindow的问题,在项目中遇到了,问了下百度、谷歌,发现都是只写了这个现象,并没有写怎么解决的?  你说恼不恼火。so,我用我的方法给大家说下吧。

首先直接在第一个popupwindow中正常调用popupwindow会报下面的错误,如下:

android.view.WindowManager$BadTokenException: Unable to add window -- token android.view.ViewRootImpl$W@5321d64 for displayid = 0 is not valid; is your activity running?
        at android.view.ViewRootImpl.setView(ViewRootImpl.java:936)
        at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:398)
        at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:131)

解决方法:

 

注意观察,在第一个popupwindow被实例化调用时,是不是会传入一些参数,比如context上下文、待显示的数据集、回调方法什么的,同时会调用showAtLocation方法对吧,这个方法是控制popupwindow显示位置的。仔细看下这个方法,第一个参数是传入当前activity的view。

再结合错误信息,既然和activity建立联系,这个岂不是一个突破点,于是,把这个view通过第一个popupwindow的构造方法,传入到第一个popupwindow中。然后在第二个popupwindow调用showAtLocation方法时,传入这个view,就OK了。

 

备注:

上面的方法应该能解决问题了,在搜索时,看到其他还有这样的设置方法,这里备注下,万一上面我写的方法不灵,还可以试试这个。

第二个popupwindow中inflate方法改变填充布局的方式。

默认的方式是这样的:

 View inflate = View.inflate(mContext,R.layout.popwindow_layout,null);

可以考虑改成下面的方式:

LayoutInflater mLayoutInflater = (LayoutInflater) mContext.getSystemService(LAYOUT_INFLATER_SERVICE);
        View inflate = mLayoutInflater.inflate(R.layout.popwindow_layout,null);

好了,至此,popupwindow嵌套调用问题就解决了。

我用“解决方法”就把问题解决了,“备注”只是备忘。

猜你喜欢

转载自blog.csdn.net/wjw_java/article/details/108616543
今日推荐