讲道理,先允许我吐槽一下google的api,我找了一天多的资料也没找到除了在manifest中配置外,其他的实现Activity对话框样式的方法。这对app来说可能无所谓,但是SDK因为大部分情况下不能使用xml配置文件,会导致大量的特性要去寻求代码的解决方案,而谷歌基本都没有提供这样方案的官方文档,只能自己看源码去倒推,甚至很多时候还要反射来做。
坑1:
Dialog样式的Activity是在Manifest文件中配置这样一行: android:theme=”@android:style/Theme.Dialog”,然后呢,没有了,我想改大小或者其他参数呢,不行,因为像这样的配置xml:
<style name="dialog" parent="@android:style/Theme.Dialog">
<!-- 去黑边 -->
<item name="android:windowFrame">@null</item>
<!-- 设置是否可滑动 -->
<item name="android:windowIsFloating">true</item>
<!-- 设置是否透明 -->
<item name="android:windowIsTranslucent">true</item>
<!-- 无标题 -->
<item name="android:windowNoTitle">true</item>
<!-- 背景 -->
<item name="android:background">@null</item>
<!-- 窗口背景 -->
<item name="android:windowBackground">@android:color/transparent</item>
<!-- 是否变暗 -->
<item name="android:backgroundDimEnabled">false</item>
<!-- 点击空白部分activity不消失 -->
<item name="android:windowCloseOnTouchOutside">false</item>
</style>
SDK因为没有自己的style.xml文件,所以用不了。
坑2:
基于上面的原因,我们现在要自定义Activity 的大小就会遇到一个问题,因为dialog样式下的Activity不像普通的Activity是默认全屏的,默认是没有大小的。什么意思,就是说它默认的大小是wrap_content,假设你里面的控件比如是个ImageView,如果ImageView里没有图片的时候,你打开这个Activity就是个空界面什么都没有。这不是我们想要的,我们想要的是默认情况下用户点开Activity哪怕啥也没有,白屏也比一片漆黑强。
第一想法是塞一个默认大小的layout在Activity中,试了下,并没有什么卵用,于是去看源码,发现问题出在Window本身,具体的可以参考Android Window的知识,这里不再赘述。根据我们的需求需要设置以下代码:
private void initWindow()
{
android.view.WindowManager.LayoutParams p = getWindow().getAttributes();
p.width = (int) (Constants.SCREEN_WIDTH * Constants.WIDTH_WEIGHT);
p.height = (int) (Constants.SCREEN_HEIGHT * Constants.HEIGHT_WEIGHT);
p.gravity = Gravity.CENTER;
p.dimAmount = 0.5f;
getWindow().setAttributes(p);
}
怎么获取屏幕宽高,不用我说了吧,weight就是你需要的dialog样式的比例,注意1.0是没有用的。
坑3:
上面我们设置了默认window的宽高,然后设置进去了一个View,View的宽高和Window的宽高是一样一样的,这个没有问题吧???
呵呵,图样图森破。按照这个设置了之后会发现,如果塞一个textView进去,边缘总有一点字会显示不出来,这是什么鬼!仔细研究了半天,发现症结在DecorView上,关于DecorView的原理请百度,Dialog样式的时候,DecorView默认是有一个padding的,所以当你的View按照window大小设置进去的时候,就会导致边缘被挤压出屏幕边缘。我靠,我实在是想不通这个padding设置了有什么意义,而且setPadding为0之后还有用。
肿么办呢,上代码:
private void initViewSizes()
{
View decorView = getWindow().getDecorView();
int paddingLeft = decorView.getPaddingLeft();
int paddingRight = decorView.getPaddingRight();
int paddingTop = decorView.getPaddingTop();
int paddingBottom = decorView.getPaddingBottom();
Constants.HOME_VIEW_WIDTH =
(int) (Constants.SCREEN_WIDTH * Constants.WIDTH_WEIGHT)
- paddingLeft - paddingRight;
Constants.HOME_VIEW_HEIGHT =
(int) (Constants.SCREEN_HEIGHT * Constants.HEIGHT_WEIGHT)
- paddingTop - paddingBottom;
}
恩 当设置内部View大小的时候,把这个padding减掉就对啦。
就酱。