DialogFragment是系统推荐的dialog,至于它的好处有很多,最重要的是通过Fragment可以把dialog纳入到Fragment的生命周期中,这样就不会出现dialog显示在activity中旋转屏幕后dialog发生错误。
1 自定义dialogFragment
public class MyDialogFragment extends DialogFragment {
private Context mContext;
private View baseView;
public static MyDialogFragment newInstance(int type) {
Bundle args = new Bundle();
args.putInt("type", type);
MyDialogFragment fragment = new MyDialogFragment();
fragment.setArguments(args);
return fragment;
}
@Override
public void onAttach(Context context) {
super.onAttach(context);
this.mContext = context;
}
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
final Dialog dialog = getDialog();
if (dialog != null) {
dialog.setCanceledOnTouchOutside(false);
dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
if (dialog.getWindow() != null) {
dialog.getWindow().setBackgroundDrawable(new ColorDrawable(0));
}
}
baseView = inflater.inflate(R.layout.xxxx, null);
return baseView;
}
@Override
public void onStart() {
super.onStart();
final Dialog dialog = getDialog();
if (dialog != null) {
if (dialog.getWindow() != null) {
//设置宽高
dialog.getWindow().setLayout(WindowUtils.getScreenWidth(context) * 90 / 192, WindowManager.LayoutParams.WRAP_CONTENT);
}
}
}
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
EventBus.getDefault().register(this);
if (getArguments() != null) {
mOpenType = getArguments().getInt("type", 1);
}
initViews(baseView );
initData();
}
private void initData() {
//加载数据
}
private void initViews(View view) {
//设置dialog的高
mRootView = view.findViewById(R.id.xxxxxxx);
ViewGroup.LayoutParams params = mRootView.getLayoutParams();
params.height = WindowUtils.getScreenHeight(context) * 5 / 7;
mRootView.setLayoutParams(params);
//获取view ,设置event
}
@Override
public void onDestroy() {
super.onDestroy();
}
@Override
public void onDestroyView() {
super.onDestroyView();
}
}
}
2 DialogFragment监听返回键
实现DialogInterface.OnKeyListener 接口,监听返回键。
implements DialogInterface.OnKeyListener {
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
final Dialog dialog = getDialog();
if (dialog != null) {
dialog.setCanceledOnTouchOutside(false);
dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
if (dialog.getWindow() != null) {
dialog.getWindow().setBackgroundDrawable(new ColorDrawable(0));
}
//添加监听
dialog.setOnKeyListener(this);
}
return inflater.inflate(R.layout.xxx, null);
}
@Override
public boolean onKey(DialogInterface dialog, int keyCode, KeyEvent event) {
if(keyCode == KeyEvent.KEYCODE_BACK){
//此处捕获back操作,如果不希望所在的Activity监听到back键,需要返回true,消费掉。
backLogical();
dismissAllowingStateLoss();
return true;
}else {
//这里注意当不是返回键时需将事件扩散,否则无法处理其他点击事件
return false;
}
}
3 设置dialogFragment的宽高
@Override
public void onStart() {
super.onStart();
final Dialog dialog = getDialog();
if (dialog != null) {
if (dialog.getWindow() != null) {
//设置dailog的宽和高度模式
dialog.getWindow().setLayout(WindowUtils.getScreenWidth(context) * 90 / 192, WindowManager.LayoutParams.WRAP_CONTENT);
}
}
}
//然后initview时,获取布局文件根布局,设置高度
ViewGroup.LayoutParams params = mRootView.getLayoutParams();
params.height = WindowUtils.getScreenHeight(context) * 5 / 7;
mRootView.setLayoutParams(params);