有的時候我們需要在任何一個界面都可以彈出一個對話框 比如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形式 這樣也可以在任何地方彈出對話框了