Activity Dialog样式的那些坑

来源:互联网 发布:我的世界手机版机枪js 编辑:程序博客网 时间:2024/06/03 21:12

讲道理,先允许我吐槽一下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减掉就对啦。

就酱。

0 0