本次记录第一次使用DialogFragment遇到的问题
项目中遇到的各种弹窗实现有很多中方式,本文简单介绍利用DialogFragment实现。
- 首先需要继承DialogFragment,代码如下
package com.yunduo.wisdom.view.widget;
import android.app.Dialog;
import android.content.Context;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.app.DialogFragment;
import android.view.Gravity;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import com.yunduo.wisdom.R;
/**
* Created by parade岁月 on 2019/9/20 18:32
* 退出登录
*/
public class LogoutDialog extends DialogFragment implements View.OnClickListener {
private Context mContext;
private View logOut;
private View exit;
private onDialogClickListener clickListener;
public static LogoutDialog newInstance() {
Bundle args = new Bundle();
LogoutDialog fragment = new LogoutDialog();
fragment.setArguments(args);
return fragment;
}
@Override
public void onAttach(Context context) {
super.onAttach(context);
this.mContext = context;
}
@NonNull
@Override
public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) {
Dialog dialog = new Dialog(mContext);
//设置dialog的布局参数和弹出位
dialog.setContentView(R.layout.dialog_login_out);//自定义布局
Window window = dialog.getWindow();
window.setBackgroundDrawableResource(android.R.color.transparent);//宽度占满全屏
WindowManager.LayoutParams params = window.getAttributes();
params.width = WindowManager.LayoutParams.MATCH_PARENT;//diaolog的宽占满全屏,必须配合setBackgroundDrawableResource设置透明使用,否则不会宽度全屏
params.height = WindowManager.LayoutParams.WRAP_CONTENT;//dialog的高
params.gravity = Gravity.BOTTOM;//设置dialog出现在底部
window.setAttributes(params);
logOut = window.getDecorView().findViewById(R.id.custom_logout);
exit = window.getDecorView().findViewById(R.id.custom_exit);
logOut.setOnClickListener(this);
exit.setOnClickListener(this);
return dialog;
}
@Override
public void onClick(View v) {
if (clickListener != null){
clickListener.onClickDialogListener(v);
dismiss();
}
}
public interface onDialogClickListener{
public void onClickDialogListener(View view);
}
public void setOnDialogClickListener(onDialogClickListener listener){
this.clickListener = listener;
}
}
下面说一下我在使用中遇到的两个问题
-
设置
params.width = WindowManager.LayoutParams.MATCH_PARENT
后dialog宽度并不能占满全屏,还需要结合Window window = dialog.getWindow();window.setBackgroundDrawableResource(android.R.color.transparent);
使用才能达到宽度满屏的效果。 -
设置控件的点击事件
-
在自定义的DialogFragment中定义回调接口,供在activity或者fragment中使用是设置时间监听
private onDialogClickListener clickListener; public interface onDialogClickListener{ public void onClickDialogListener(View view); } public void setOnDialogClickListener(onDialogClickListener listener){ this.clickListener = listener; }
-
找到控件
-
在控件的点击事件中调用接口的方法
logOut.setOnClickListener(this); exit.setOnClickListener(this); @Override public void onClick(View v) { if (clickListener != null){ clickListener.onClickDialogListener(v); dismiss(); } }
-
在ac或者fg中使用接口回调设置点击监听
dialog.setOnDialogClickListener(new LogoutDialog.onDialogClickListener() { @Override public void onClickDialogListener(View view) { switch (view.getId()) { case R.id.custom_logout: app.dataCenter.clearCache(); finish(); EventBusUtil.sendEvent(new Event(Constant.EventCode.SETTING)); break; case R.id.custom_exit: //退出App,但是没有退出登录 ActivityUtils.finishAllActivities(); break; } }
-