android activity方式的dialog

效果展示

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);
        }

/**
 * //切记:在父类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;
    }

}

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
如果你想让多个 Activity Dialog 窗口都置顶,可以考虑使用一个辅助类来管理所有的 Dialog 窗口。以下是一种可行的实现方式: 1. 创建一个名为 `DialogManager` 的辅助类,并添加以下代码: ```java public class DialogManager { private static ArrayList<Dialog> sDialogs = new ArrayList<>(); public static void addDialog(Dialog dialog) { if (!sDialogs.contains(dialog)) { sDialogs.add(dialog); updateDialogs(); } } public static void removeDialog(Dialog dialog) { if (sDialogs.contains(dialog)) { sDialogs.remove(dialog); updateDialogs(); } } private static void updateDialogs() { Dialog topDialog = null; for (Dialog dialog : sDialogs) { if (dialog.isShowing()) { if (topDialog == null || dialog.getWindow().getAttributes().type > topDialog.getWindow().getAttributes().type) { topDialog = dialog; } } } if (topDialog != null) { topDialog.getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); topDialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT); } } } ``` 这个类维护了一个 `sDialogs` 静态成员变量,用于存储所有的 Dialog 窗口。`addDialog()` 和 `removeDialog()` 方法分别用于添加和删除 Dialog 窗口。`updateDialogs()` 方法会在 Dialog 窗口被添加或删除时调用,它会找到当前最顶层的 Dialog 窗口,并将其置顶。 2. 在每个需要显示 Dialog 窗口的 Activity 中,重写 `onCreateDialog()` 方法,并在其中添加以下代码: ```java @Override protected Dialog onCreateDialog(int id) { Dialog dialog = new Dialog(this); // 设置 Dialog 窗口的属性 DialogManager.addDialog(dialog); return dialog; } @Override protected void onStop() { super.onStop(); DialogManager.removeDialog(getDialog()); } ``` 这将会在每个 Activity 中创建一个 Dialog 窗口,并将其添加到 `DialogManager` 中进行管理。当 Activity 停止时,需要将其对应的 Dialog 窗口从 `DialogManager` 中删除。 请注意,在添加 `TYPE_SYSTEM_ALERT` 类型的窗口时,需要申请 `android.permission.SYSTEM_ALERT_WINDOW` 权限。如果你的应用程序的 targetSdkVersion 是 26 或更高版本,则还需要在 AndroidManifest.xml 文件中添加该权限。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

夢鑰

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值