android 透明activity报错?

平时设置透明的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
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值