TYPE_SYSTEM_ALERT弹Dialog的问题

需求:请求网络,弹窗(窗口不为Activity为Dialog且dialog为系统级即在任何地方都能弹窗)

由于dialog是系统级,所以要用到权限TYPE_SYSTEM_ALERT,其实能够很简单的弹窗,为了复用视图就牵扯到很多问题了。问题描述如下:

问题描述:

按照简单的思路走 第一次加载的时候,执行如下流程

//加载视图
mView = inflater.inflate(R.layout.activity_screen_trans, null);
//设置视图
 mBuilder = new AlertDialog.Builder(getApplicationContext());
mBuilder.setView(mView);
//创建视图和设置弹出窗口类型
AlertDialog dialog = mBuilder.create();
mWindow = dialog.getWindow();
mWindow.setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);
//展示视图
 dialog.show();

第二次加载 我希望能够复用mView这个视图,但是此时问题出现了,log抛出了这个异常throw new RuntimeException("view " + this + " being added, but" + " it already has a parent");。就是说mView在视图树中 有个父类了。

问题原因分析

原因在与dialog.show()这个地方,它大概的意思是,因为任何的dialog或者view都需要有一个DectorView,所以系统会在mView上加FrameLayoutDectorView,所以下一次复用的时候mView就会有一个父类了,所以就报错。

解决方案

现在的解决方案就是想想有没有实现remove parent之类功能的函数,baidu和google都没有结果后,快放弃这个方法了,但是觉得尽然能生成这棵树,肯定也能删除这棵树,所以准备找没有暴露出来的方法,最后找到了assignParent(ViewParent),然后用反射调用就可以了。反射注意,参数是Object[]类型。需要如下调用

Method method = View.class.getDeclaredMethod("assignParent", ViewParent.class);
method.setAccessible(true);
Object[] parameters = { null };
method.invoke(mView, parameters);
阅读更多
文章标签: Android Dialog 弹窗
个人分类: Android Dialog
上一篇一张图解决Service的生命周期问题
下一篇可能比扔物线写得还好的对RxJava的理解
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭