当采用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();
}
}