当采用popupWindow或是dialog无法达到预期的效果时,可以考虑使用 popupWindow要考虑解决穿透,点击窗体外还有效果。 AlertDialog无法直接达到要求, DialogFragment可以帮助我们非常方便地完成自定义弹窗,直接设置定义的view,满中如下 1、点击弹窗外不允许编辑 2、点击弹窗外不消失 Demo如下: public class Fragment extends DialogFragment { private TextView tvCancel, tvSure, tvTitle, tvContent; private BackUpListener backUpListener; private View.OnClickListener onClickListen = new View.OnClickListener() { @Override public void onClick(View v) { } }; @Override public void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); } @Override public void onStart() { super.onStart(); initWindowParams(); } @Override public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { View contentView = inflater.inflate(R.layout.fragment_show_autobackup_dialog, container, false); initView(contentView); initData(); return contentView; } private void initView(View contentView) { tvSure = contentView.findViewById(R.id.tv_sure); } private void initData() { tvCancel.setOnClickListener(onClickListen); tvSure.setOnClickListener(onClickListen); } private void initWindowParams() { Window window = getDialog().getWindow(); window.setGravity(Gravity.CENTER); // 这里控制弹出的位置 window.getDecorView().setPadding(0, 0, 0, 0); window.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT)); window.setDimAmount(0.2f); WindowManager.LayoutParams lp = window.getAttributes(); DisplayMetrics displayMetrics = getResources().getDisplayMetrics(); lp.width = Math.max((int) (320 * displayMetrics.density), displayMetrics.widthPixels / 2); lp.height = WindowManager.LayoutParams.WRAP_CONTENT; //点击事件是否穿透 dialog // lp.flags = lp.flags | WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL; //按空白处不能取消动画 getDialog().setCanceledOnTouchOutside(false); window.setAttributes(lp); window.clearFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE); window.clearFlags(WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM); window.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE); getDialog().setOnKeyListener(new DialogInterface.OnKeyListener() { @Override public boolean onKey(DialogInterface dialog, int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_BACK) { return true; } return false; } }); } @Override public void show(FragmentManager manager, String tag) { // super.show(manager, tag); FragmentTransaction ft = manager.beginTransaction(); ft.add(this, tag); ft.commitAllowingStateLoss(); } public void setAutoBackUpListener(BackUpListener backUpListener) { this.backUpListener = backUpListener; } public interface BackUpListener { void BackUpListener(); } }