有的时候我们需要在任何一个界面都可以弹出一个对话框 比如activity service reciver等 这种情况下我们有两种方式
一种是利用windowmanager弹出一个系统对话框
// 获取WindowManager final WindowManager mWindowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE); final WindowManager.LayoutParams params = new WindowManager.LayoutParams(); // 类型 params.type = WindowManager.LayoutParams.TYPE_TOAST; // 设置flag params.flags = WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE; // 如果设置了WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,弹出的View收不到Back键的事件 // 不设置这个弹出框的透明遮罩显示为黑色 params.format = PixelFormat.TRANSLUCENT; // FLAG_NOT_TOUCH_MODAL不阻塞事件传递到后面的窗口 // 设置 FLAG_NOT_FOCUSABLE 悬浮窗口较小时,后面的应用图标由不可长按变为可长按 // 不设置这个flag的话,home页的划屏会有问题 params.width = WindowManager.LayoutParams.WRAP_CONTENT; params.height = WindowManager.LayoutParams.WRAP_CONTENT; params.gravity = Gravity.CENTER; final View mView = LayoutInflater.from(context).inflate(R.layout.layout_main_view, null); // mWindowManager.removeView(mView); Button ensure_btn = (Button) mView.findViewById(R.id.ensure_btn); Button cancle_btn = (Button) mView.findViewById(R.id.cancle_btn); TextView textView = (TextView) mView.findViewById(R.id.title_tv); ensure_btn.setText("確定"); cancle_btn.setText("取消"); textView.setText(message); ensure_btn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // 隐藏弹窗 mWindowManager.removeView(mView); callback.onPosition(); } }); cancle_btn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { mWindowManager.removeView(mView); callback.onNegative(); } }); mWindowManager.addView(mView, params);
一种是把activity当做是dialog形式 这样也可以在任何地方弹出对话框了