一、场景
最近在做BottomSheetDialog这个底部弹框的时候,在设置dialog的style的时候遇到一个问题:
style的代码样式:
<!--评论弹框dialog的style--> <style name="dialog" parent="@android:style/Theme.Holo.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">@android:color/transparent</item> <!--阴影 --> <item name="android:windowBackground">@android:color/transparent</item> <!-- Dialog进入及退出动画 --> <item name="android:windowAnimationStyle">@style/BottomShowAnimation</item> <!--弹窗背景是否变暗--> <item name="android:backgroundDimEnabled">true</item> </style> <!-- dialog从ios效果动画 --> <style name="BottomShowAnimation" parent="@android:style/Animation.Dialog"> <item name="android:windowEnterAnimation">@anim/enter_bottom_menu</item> <item name="android:windowExitAnimation">@anim/exit_bottom_menu</item> </style>
二、原因
运行报错:You need to use a Theme.AppCompat theme (or descendant) with this activity.
问题分析:我们观察发现BottomSheetDialog的源码:
发现这个类继承的是AppCompatDialog,而不是我们常见的Dialog这个类,所以看报错信息就知道,它的意思就是要我们的这个dialog依附的activity的主题必须得是Theme.AppCompat这样的主题,懂这个原因之后,我去查看了我的activity使用的主题:(这里要说明一下,如果你没在清单文件里面给你对应的activity设置主题的话,就会使用的是Application这个界面下面的总Theme主题,懂我意思吧?)我的activity继承的是FragmentActivity
我这里是activity节点也使用了Theme,所以跟着进去看一下是不是我们的activity没有使用Theme.AppCompat这个相关的主题。
进去一看,的确,因为这是个比较老项目,使用的主题都是android:Theme这个主题,没有使用到Theme.AppCompat,虽然我们不知道android的主题有什么不同,主题这块一直没搞懂,得找个时间补补知识点。
三、解决
上面知道报错的原因之后我们就去解决:改主题
其实android中改主题还是很慌的,担心会改动到其他地方,比如说样式的问题,有点主题有默认样式,你修改之后发现没了。比如说上面的android:textColorHint就在上面的那个android:Theme中默认就是灰色的,但是我使用这个Theme.AppCompat发现项目中的EditView的textColorHint默认是白色了,因为我没给EditView设置这个属性的颜色,就会使用主题中自带的颜色,所以我这里加上了这个属性<item name="android:textColorHint">@color/color_666666</item>灰色颜色值。
如果改完主题有其他问题就再继续解决。
四、总结
发现问题------>分析问题------>解决问题。