Android 经典笔记七 全局弹窗Dialog 您所在的位置:网站首页 layoutlnflaterfrom Android 经典笔记七 全局弹窗Dialog

Android 经典笔记七 全局弹窗Dialog

2024-07-15 06:38| 来源: 网络整理| 查看: 265

第一个方法利用系统弹出dialog

在alter.show()语句前加入: alert.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT); 然后在AndroidManifest.xml中加入权限:android.permission.SYSTEM_ALERT_WINDOW

第二个方法是获取WindowManager,直接添加view

wmParams = new WindowManager.LayoutParams(); //获取的是WindowManagerImpl.CompatModeWrapper mWindowManager = (WindowManager)getApplication().getSystemService(getApplication().WINDOW_SERVICE); //设置window type wmParams.type = LayoutParams.TYPE_PHONE; //设置浮动窗口不可聚焦(实现操作除浮动窗口外的其他可见窗口的操作) wmParams.flags = LayoutParams.FLAG_NOT_FOCUSABLE; //调整悬浮窗显示的停靠位置为左侧置顶 wmParams.gravity = Gravity.LEFT | Gravity.TOP; // 以屏幕左上角为原点,设置x、y初始值,相对于gravity wmParams.x = 0; wmParams.y = 0; //设置悬浮窗口长宽数据 wmParams.width = WindowManager.LayoutParams.WRAP_CONTENT; wmParams.height = WindowManager.LayoutParams.WRAP_CONTENT; LayoutInflater inflater = LayoutInflater.from(getApplication()); //获取浮动窗口视图所在布局 mFloatLayout = (LinearLayout) inflater.inflate(R.layout.float_layout, null); //添加mFloatLayout mWindowManager.addView(mFloatLayout, wmParams);

在服务里,获取栈顶的Activity,弹窗

public static void showActivityDialog(final Activity activity){ if(AppUtils.isActivityLiving(activity)){ int appCount = BaseApplication.getInstance().getAppCount(); Log.e("全局弹窗","------"); //只有当APP处于前台时才弹窗 if(appCount==1){ Log.e("全局弹窗","前台"); AlertDialog.Builder builder = new AlertDialog.Builder(activity); final AlertDialog alertDialog = builder.create(); alertDialog.setCancelable(false); View view = LayoutInflater.from(activity).inflate(R.layout.dialog_custom_view, null); alertDialog.setView(view); if(alertDialog.getWindow()!=null){ Window window = alertDialog.getWindow(); window.setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT); window.setBackgroundDrawableResource(R.color.transparent); WindowManager.LayoutParams params = window.getAttributes(); //WindowManager.LayoutParams params = new WindowManager.LayoutParams(); params.width = WindowManager.LayoutParams.MATCH_PARENT; params.height = WindowManager.LayoutParams.MATCH_PARENT; params.gravity = Gravity.CENTER; window.setAttributes(params); //window.setGravity(Gravity.CENTER); //此处可以设置dialog显示的位置 //window.setWindowAnimations(R.style.dialog_custom_view); //添加动画 } //报错:Unable to add window -- token null is not for an application //全局弹窗必须依附Activity,必须在Activity运行下才能弹窗,否则崩溃 //注意,小米,三星等手机需要手动打开权限才行 if (Build.VERSION.SDK_INT >= 23) { if(!Settings.canDrawOverlays(activity)) { ToastUtils.showToast(activity,"请打开投资界允许权限开关"); Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); activity.startActivity(intent); return; } else { //Android6.0以上 if (!alertDialog.isShowing()) { alertDialog.show(); } } } else { //Android6.0以下,不用动态声明权限 if (!alertDialog.isShowing()) { alertDialog.show(); } } alertDialog.setOnKeyListener(new DialogInterface.OnKeyListener() { @Override public boolean onKey(DialogInterface dialog, int keyCode, KeyEvent event) { if(keyCode==KeyEvent.KEYCODE_BACK){ if(alertDialog.isShowing()){ alertDialog.dismiss(); } } return false; } }); AppUtils.setBackgroundAlpha(activity,0.5f); //Unable to add window android.view.ViewRootImpl$W@12b82d6 -- permission denied for this window type //alertDialog.show(); alertDialog.setOnDismissListener(new DialogInterface.OnDismissListener() { @Override public void onDismiss(DialogInterface dialog) { AppUtils.setBackgroundAlpha(activity,1.0f); } }); } } }



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有