平时设置透明的activity没啥问题,拿了新项目,突然来了这个错,原来是继承了AppCompatActivity,导致的错误,没办法,继承这个还要使用MutableLiveData
IllegalStateException: You need to use a Theme.AppCompat theme (or descendant) with this activity.
这里就这几贴出解决办法了
activity用这个
<style name="Transparent">
<item name="android:windowNoTitle">true</item>
<item name="android:windowBackground">@color/color60transparent</item>
<item name="android:windowAnimationStyle">@android:style/Animation.Translucent</item>
<item name="android:windowIsTranslucent">true</item>
</style>
AppCompatActivity 用这个
<style name="NoTitleTranslucentTheme" parent="Theme.AppCompat.Light.NoActionBar">
<item name="android:windowNoTitle">true</item>
<item name="android:windowBackground">@color/color60transparent</item>
<item name="android:windowIsTranslucent">true</item>
</style>
注意:当targetapi>=26时,透明的activity在8.0的设备上会崩溃,得特殊处理下
override fun onCreate(savedInstanceState: Bundle?) {
if (Build.VERSION.SDK_INT == Build.VERSION_CODES.O && isTranslucentOrFloating()) {
val result = fixOrientation()
if (result) {
requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED
}
}
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_self_heard)
}
override fun setRequestedOrientation(requestedOrientation: Int) {
if (Build.VERSION.SDK_INT == Build.VERSION_CODES.O && isTranslucentOrFloating()) {
/* 修复android o sdk=26版本问题
Only fullscreen opaque activities can request orientation*/
return
}
super.setRequestedOrientation(requestedOrientation)
}
/**
* 判断activity方向是否福鼎
*
* @return
*/
private fun fixOrientation(): Boolean {
try {
val field = Activity::class.java.getDeclaredField("mActivityInfo")
field.isAccessible = true
val o = field.get(this) as ActivityInfo
o.screenOrientation = -1
field.isAccessible = false
return true
} catch (e: Exception) {
e.printStackTrace()
}
return false
}
/**
* 判断是否为透明主题
*
* @return
*/
private fun isTranslucentOrFloating(): Boolean {
var isTranslucentOrFloating = false
try {
val styleableRes = Class.forName("com.android.internal.R\$styleable").getField("Window").get(null) as IntArray
val ta = obtainStyledAttributes(styleableRes)
val m = ActivityInfo::class.java.getMethod("isTranslucentOrFloating", TypedArray::class.java)
m.isAccessible = true
isTranslucentOrFloating = m.invoke(null, ta) as Boolean
m.isAccessible = false
} catch (e: Exception) {
e.printStackTrace()
}
return isTranslucentOrFloating
}