Android Dialog使用之-DialogFragment
2020-08-25 本文已影响0人
可乐_JS
-
具体使用,以退出登录提示弹窗(ExitLoginNoticeDialog )为例,代码如下:
/**
* Des: 退出登录提示dialog
* Created by kele on 2020/8/10.
* E-mail:984127585@qq.com
*/
public class ExitLoginNoticeDialog extends BaseDialogFragment {
private static final String TAG = ExitLoginNoticeDialog.class.getSimpleName();
private Callback mCallback;
private ExitLoginNoticeDialog(int width, int height, int gravity) {
super(width, height, gravity);
}
public static ExitLoginNoticeDialog show(FragmentManager fm) {
ExitLoginNoticeDialog dialog = new ExitLoginNoticeDialog((int) (ScreenUtils.getAppScreenWidth() * 0.8), WindowManager.LayoutParams.WRAP_CONTENT, Gravity.CENTER);
dialog.show(fm, TAG);
return dialog;
}
@Override
protected int getLayoutId() {
return R.layout.dialog_exit_login_notice;
}
@Override
protected void initViews(View v) {
v.findViewById(R.id.cancel_btn_tv).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
dismiss();
}
});
v.findViewById(R.id.sure_btn_tv).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
dismiss();
if (null != mCallback) {
mCallback.onClickSure();
}
}
});
}
public void setCallback(Callback cb) {
mCallback = cb;
}
public interface Callback {
void onClickSure();
}
}
-
BaseDialogFragment,代码如下:
/**
* Des: dialog基类
* Created by kele on 2020/7/23.
* E-mail:984127585@qq.com
*/
public abstract class BaseDialogFragment extends DialogFragment {
private static final String TAG = BaseDialogFragment.class.getSimpleName();
private int DEFAULT_WIDTH = WindowManager.LayoutParams.MATCH_PARENT;
private int DEFAULT_HEIGHT = WindowManager.LayoutParams.WRAP_CONTENT;
private int DEFAULT_GRAVITY = Gravity.BOTTOM;
private Dialog dialog;
public BaseDialogFragment() {
this(WindowManager.LayoutParams.MATCH_PARENT, WindowManager.LayoutParams.WRAP_CONTENT, Gravity.BOTTOM);
}
public BaseDialogFragment(int width, int height, int gravity) {
DEFAULT_WIDTH = width;
DEFAULT_HEIGHT = height;
DEFAULT_GRAVITY = gravity;
}
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
this.getDialog().requestWindowFeature(Window.FEATURE_NO_TITLE);
View view = inflater.inflate(getLayoutId(), container, false);
initViews(view);
return view;
}
@Override
public void onStart() {
super.onStart();
dialog = getDialog();
if (null != dialog) {
Window window = dialog.getWindow();
if (null != window) {
window.getDecorView().setPadding(0, 0, 0, 0);
window.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
WindowManager.LayoutParams lp = window.getAttributes();
lp.width = DEFAULT_WIDTH;
lp.height = DEFAULT_HEIGHT;
lp.gravity = DEFAULT_GRAVITY;
lp.windowAnimations = android.R.style.Animation_InputMethod;
window.setAttributes(lp);
}
dialog.setCancelable(true);
dialog.setCanceledOnTouchOutside(true);
}
}
public void setCancelable(boolean cancelable) {
if (null == dialog) {
return;
}
dialog.setCancelable(cancelable);
}
public void setCanceledOnTouchOutside(boolean canceledOnTouchOutside) {
if (null == dialog) {
return;
}
dialog.setCanceledOnTouchOutside(canceledOnTouchOutside);
}
@Override
public void show(@NonNull FragmentManager manager, @Nullable String tag) {
super.show(manager, tag);
}
protected abstract int getLayoutId();
protected abstract void initViews(View v);
}
纠错-200923
上文中的关于设置dialog可取消、点击外部可取消设置的代码有误,今天在使用的时候才发现的,更新下
BaseDialogFragment中新增成员变量:
private boolean mCancelable =true;//默认可取消
private boolean mCanceledOnTouchOutside=true;//默认点击外部可取消
onStart中的代码修改:
dialog.setCancelable(mCancelable);
dialog.setCanceledOnTouchOutside(mCanceledOnTouchOutside);
BaseDialogFragment中的方法修改:
public void setCancelable(boolean cancelable) {
mCancelable =cancelable;
}
public void setCanceledOnTouchOutside(boolean canceledOnTouchOutside) {
mCanceledOnTouchOutside =canceledOnTouchOutside;
}
优化BaseDialog
/**
* Des: BaseDialog
* Created by kele on 2020/11/22.
* E-mail:984127585@qq.com
*/
public abstract class BaseDialog extends DialogFragment {
private int DEFAULT_WIDTH = WindowManager.LayoutParams.MATCH_PARENT;//宽
private int DEFAULT_HEIGHT = WindowManager.LayoutParams.WRAP_CONTENT;//高
private int DEFAULT_GRAVITY = Gravity.CENTER;//位置
private boolean mCancelable = true;//默认可取消
private boolean mCanceledOnTouchOutside = true;//默认点击外部可取消
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View mView = inflater.inflate(getLayoutId(), container, false);
initViews(mView);
return mView;
}
@NonNull
@Override
public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) {
Dialog mDialog = super.onCreateDialog(savedInstanceState);
if (null != mDialog) {//初始化
mDialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
mDialog.setCanceledOnTouchOutside(mCanceledOnTouchOutside);
mDialog.setCancelable(mCancelable);
Window window = mDialog.getWindow();
if (null != window) {
window.getDecorView().setPadding(0, 0, 0, 0);
window.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
WindowManager.LayoutParams lp = window.getAttributes();
lp.width = DEFAULT_WIDTH;
lp.height = DEFAULT_HEIGHT;
lp.gravity = DEFAULT_GRAVITY;
lp.windowAnimations = android.R.style.Animation_InputMethod;
window.setAttributes(lp);
}
mDialog.setOnKeyListener(new DialogInterface.OnKeyListener() {
@Override
public boolean onKey(DialogInterface dialog, int keyCode, KeyEvent event) {
return !mCancelable;
}
});
}
return mDialog;
}
/**
* 设置位置
* @param gravity
*/
public void setGravity(int gravity) {
DEFAULT_GRAVITY = gravity;
}
/**
* 设置宽
* @param width
*/
public void setWidth(int width) {
DEFAULT_WIDTH = width;
}
/**
* 设置高
* @param height
*/
public void setHeight(int height) {
DEFAULT_HEIGHT = height;
}
/**
* 设置点击返回按钮是否可取消
*
* @param cancelable
*/
public void setCancelable(boolean cancelable) {
mCancelable = cancelable;
}
/**
* 设置点击外部是否可取消
*
* @param canceledOnTouchOutside
*/
public void setCanceledOnTouchOutside(boolean canceledOnTouchOutside) {
mCanceledOnTouchOutside = canceledOnTouchOutside;
}
/**
* 设置布局
*
* @return
*/
protected abstract int getLayoutId();
/**
* 初始化Views
*
* @param v
*/
protected abstract void initViews(View v);
}
用法和上述基本相同