天天看點

android設定全局彈框,Android之全局對話框

項目中為了實作賬号多裝置登入的監聽 一個賬号在别的裝置登入時在該裝置上需要彈出對話框提示 故而用到全局對話框

實作方式

[ 1 ]. 添權重限

[ 2 ]. 設定dialog類型

一定要在show之前設定

如果類型為TYPE_SYSTEM_ALERT需要開啟懸浮窗權限 使用相當不友善

是以使用TYPE_TOAST 一般裝置不需要特意去開啟權限即可使用

//設定彈出全局對話框

dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_TOAST);

//dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);

dialog.show();

[ 3 ]. 完整代碼

public static void showDialog(final Context context, final String title, final Boolean isCancelable, final String ok, final String close, final DialogCallback callback) {

AlertDialog.Builder builder = new AlertDialog.Builder(context);

builder.setCancelable(isCancelable);

View view = View.inflate(context, R.layout.item_dialog_exit, null);

TextView tv_itemdialog_title = (TextView) view.findViewById(R.id.tv_itemdialog_title);

TextView tv_itemdialog_ok = (TextView) view.findViewById(R.id.tv_itemdialog_ok);

TextView tv_itemdialog_close = (TextView) view.findViewById(R.id.tv_itemdialog_close);

tv_itemdialog_ok.setText(ok);

tv_itemdialog_close.setText(close);

builder.setView(view);

final AlertDialog dialog = builder.create();

//設定彈出全局對話框

dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_TOAST);

dialog.show();

tv_itemdialog_title.setText(title);

tv_itemdialog_ok.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {

callback.onPositive(dialog);

}

});

tv_itemdialog_close.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {

callback.onNegative(dialog);

}

});

使用WindowManager實作全局對話框

public static void showPopupWindow(final Context context, final DialogCallback callback) {

// 擷取WindowManager

final WindowManager mWindowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);

final WindowManager.LayoutParams params = new WindowManager.LayoutParams();

// 類型

params.type = WindowManager.LayoutParams.TYPE_SYSTEM_ALERT;

// 設定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;

TextView textView = new TextView(context);

textView.setText("sfgsfdsfbsadfbasdfg");

textView.setTextSize(100);

final View mView = LayoutInflater.from(context).inflate(R.layout.item_dialog_exit, null);

TextView tv_itemdialog_title = (TextView) mView.findViewById(R.id.tv_itemdialog_title);

TextView tv_itemdialog_ok = (TextView) mView.findViewById(R.id.tv_itemdialog_ok);

TextView tv_itemdialog_close = (TextView) mView.findViewById(R.id.tv_itemdialog_close);

tv_itemdialog_ok.setText("重新登入");

tv_itemdialog_close.setText("登出");

tv_itemdialog_title.setText("該賬戶在其他裝置登入,若不是您在操作,請及時修改密碼以防洩露資訊");

tv_itemdialog_ok.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {

// 隐藏彈窗

mWindowManager.removeView(mView);

callback.onPositive();

}

});

tv_itemdialog_close.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {

mWindowManager.removeView(mView);

callback.onNegative();

}

});

mWindowManager.addView(textView, params);

}