diaog里的window对象:
我们知道dialog是由window来控制其显示属性的,无所依我们可以在window中去寻找我们需要实现的功能。
看图:
dialog中存在window对象,通常我们动态设置window的宽高,就可以通过getWindow()
方法来获取,然后修改。但是还有没有其他方法呢?
那就看window里面的方法:
先说dialog里面的window初始化
我们可以看到window默认是居中的并且绑定了windowManager,那么是不是window的配置参数可以通过windowManager来控制呢?
那么显示的关键应该是show方法吧:
从中可以看到show的方式的确是windowmanager里的参数控制,并通过将decor添加到manager里显示,我们看到了我们平时修改dialog样式的熟悉的方法
WindowManager.LayoutParams l = mWindow.getAttributes()
通过这个方法,我们能拿到对应的LayoutParams 来修改。
那么dismiss()
方法应该也是一样的,应该也是从windowManager里移除掉对应的decorview:
那么既然window是受windowManager控制,是不是可以在windowManager里找到方法修改?
window是一个抽象类,先看看window类,里面很多都是需要phonewindow具体实现的方,phonewindow主要是实现一些事件的分发等,但是有些方法是已经实现的了,但是一些关于window参数的方法,其已经实现了:
可以看到一些window参数的设置是已经实现了,其具体实现就是以下的两个方法:
getAttributes()
方法就是设置window对象一些位置以及动画等flag的重要方法,那么如果想修改,是不是可以通过invoke这个方法,动态修改flag来实现呢?
具体这些flag当然是出自windowManager里的,我们可以在windowManager里找到
一系列的flag,所依我们实现的方法就是来invoke这个
setPrivateFlags()
方法,来修改我们想要。
具体如下:
private static void setDialogNoAnimate(Window window)
{
try {
Method method=Window.class.getDeclaredMethod("setPrivateFlags",int.class,int.class);
method.setAccessible(true);
method.invoke(window,PRIVATE_FLAG_PREVENT_DIALOG_NO_ANIMATE,PRIVATE_FLAG_PREVENT_DIALOG_NO_ANIMATE );
} catch(Exception e) {
e.printStackTrace();
}
}
通过获取这个setPrivateFlags这个方法,然后修改其参数,可以达到我们想要修改的目的。
结语
只是简单介绍了一些可用的方法,可以看情况来使用,有不对之处,敬请指出。