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减掉就对啦。
就酱。
- Activity Dialog样式的那些坑
- Dialog样式的Activity
- Dialog样式的Activity
- Dialog样式的Activity
- Dialog样式的Activity
- Dialog样式的Activity
- 【Android】 activity的dialog样式
- 弹出dialog样式的activity
- Activity 的Dialog 样式使用
- dialog样式的activity的全屏设置
- Android Dialog样式的Activity的实现
- 怎样做出一个dialog样式的activity
- 使用自定义透明Dialog样式的Activity
- 使用自定义透明Dialog样式的Activity
- 怎样做出一个dialog样式的activity
- 怎样做出一个dialog样式的activity
- 使用自定义透明Dialog样式的Activity
- android之Activity的Dialog样式
- Android 开子线程工作并用监听器传回结果到主线程--子线程与主线程通信
- 同步服务器间的数据代码
- eclipse中ctrl+h默认打开是Java Search,怎么设置成默认打开是File Search?
- RJ45接口定义及网线线序
- 《CMake实践》笔记二:INSTALL/CMAKE_INSTALL_PREFIX
- Activity Dialog样式的那些坑
- iOS 多个网络请求全部完成后再刷新
- Spring Security Java Config Preview: Web Security
- Git clone时报错需要设置 set Git path
- GPRS模块的TCP发送数据流程
- JSON和JSONP区别
- 在服务器里面创建FTP站点
- TCP/UDP 常用端口列表
- 《CMake实践》笔记三:构建静态库与动态库 及 如何使用外部共享库和头文件