android activity方式的dialog

667 阅读1分钟

上图

image.png 一定要注意在Android8.0版本,也不知道Android系统抽的什么风,只有在Android8.0的时候才会出现设置Activity为弹窗样式的dialog的时候才出现系统崩溃的bug,然而Android自己还没有在版本更新的时候修复了这个bug,导致在处理Android8.0的时候必须要做特殊处理**。一定要注意**

1、设置主题(在AndroidManifest的activity中设置android:theme="@style/DialogActBgStyle")

<style name="DialogActBgStyle" parent="Theme.AppCompat.Light.NoActionBar">
        <!--是否悬浮在activity上 为true时 如果手机有虚拟的底部导航  会把底部虚拟的导航遮挡-->
        <item name="android:windowIsFloating">false</item>
           <!--透明是否-->
        <item name="android:windowIsTranslucent">true</item>
 
        <item name="android:background">#00000000</item>
        <item name="android:windowBackground">@color/transparent</item>
        <!--模糊-->
        <item name="android:backgroundDimEnabled">true</item>
        <!--设置没有窗口标题、dialog标题等各种标题-->
        <item name="android:windowNoTitle">true</item>
        <item name="android:title">@null</item>
        <item name="android:dialogTitle">@null</item>
        <item name="android:windowFullscreen">true</item>
    </style>

2、代码设置(在oncreate方法中设置)

        //这一步很关键(如果不设置背景是黑色或者白色)
        window.setBackgroundDrawable(getDrawable(R.drawable.tr))
        val params = window.attributes
        params.width = ScreenUtils.getScreenWidth()
        params.height = ScreenUtils.getScreenHeight()
        params.gravity = Gravity.CENTER
        //透明度
        params.dimAmount = 0.25f
        window.attributes = params

3、代码资源  R.drawable.tr

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
     <solid android:color="#00ffffff" />
</shape>

4、处理android8.0 设置导致系统崩溃Bug

在Android8.0之后Android就解决了,只有在Android8.0的时候才会有这个问题。

   if (Build.VERSION.SDK_INT == 26 && Android8FullBug.isTranslucentOrFloating(this)) {
            Android8FullBug.fixOrientation(this);
        }

fixOrientation方法


 
/**
 * //切记:在父类oncreate()方法调用前调用该方法修改配置
 * 解决Android8.0 (Only fullscreen opaque activities can request orientation ) 即:只有全屏不透明的activity可以设置orientation
 */
public class Android8FullBug {
    /**
     * hook反射方向检查
     **/
    public static void fixOrientation(Activity activity) {
        try {
            Class activityClass = Activity.class;
            Field mActivityInfoField = activityClass.getDeclaredField("mActivityInfo");
            mActivityInfoField.setAccessible(true);
            ActivityInfo activityInfo = (ActivityInfo) mActivityInfoField.get(activity);
            //设置屏幕不固定
            activityInfo.screenOrientation = ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED;
        } catch (Exception e) {
        }
    }
 
    /**
     * hook反射检查是否透明色或者悬浮
     **/
    public static boolean isTranslucentOrFloating(Activity activity) {
        boolean isTranslucentOrFloating = false;
        try {
            int[] styleableRes = (int[]) Class.forName("com.android.internal.R$styleable").getField("Window").get(null);
            final TypedArray typedArray = activity.obtainStyledAttributes(styleableRes);
            Method method = ActivityInfo.class.getMethod("isTranslucentOrFloating", TypedArray.class);
            method.setAccessible(true);
            isTranslucentOrFloating = (boolean) method.invoke(null, typedArray);
            method.setAccessible(false);
        } catch (Exception e) {
        }
        return isTranslucentOrFloating;
    }
 
}