最近在项目中大量使用dialog 在使用时和管理时总是不方便
后来全部换成了DialogFragment 统一封装 方便管理生命周期 方便调用方法
1、实现类继承自DialogFragment类
2、必须重写onCreateView或onCreateDialog方法,onCreateView可以自定义对话框,onCreateDialog使用默认对话框
3、DialogFragment包含Dialog.setOnCancelListener() 和Dialog.setOnDismissListener()回调,可在取消或清除对话框时自定义操作
4、利用bundle和setArguments()、getArguments()方法,实现Fragment或Activity与Dialogfragment间的参数传递
onCreateDialog
方法, 返回一个创建的dialog
对象public class MyDialogFragment extends DialogFragment{
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
return super.onCreateView(inflater, container, savedInstanceState);
}
@NonNull
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
AlertDialog dialog = new AlertDialog.Builder(getActivity())
.setTitle("我是抬头")
.setMessage("我是内容")
.setPositiveButton("选项1", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
}
})
.setNegativeButton("选项2", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
}
}).create();
return dialog;
}
public class MainActivity extends AppCompatActivity {
MyDialogFragment dialogFragment;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
dialogFragment = new MyDialogFragment();
dialogFragment.show(getSupportFragmentManager(),"dialog");
}
}
onCreateView
来返回一个写好的view来完成,默认会在居中显示 @Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
if (getDialog().getWindow() != null)
getDialog().getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
View inflate = inflater.inflate(R.layout.pay_result_dialog, container, false);
mTvContent = inflate.findViewById(R.id.tv_content);
mBtnBackHome = inflate.findViewById(R.id.btn_back_home);
return inflate;
}
按照android 官方的话来说 DialogFragment
其实就是Fragment 你就把它当做一个Fragment用就可以 生命周期 方法回调等等
比如我要写一个点击事件的回调
操作方法如下
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
//返回主页
mBtnBackHome.setOnClickListener(v -> {
if (mListener != null) {
mListener.onCatalogSelect(v);
}
});
}
//回调通知
private OnBackClickListener mListener;
public void setListener(OnBackClickListener listener) {
mListener = listener;
}
public interface OnBackClickListener {
void onCatalogSelect(View view);
}
很多人在用dialog的时候,有时候需要dialog的左右全屏填充满
有如下的几种方式可以实现:
在5.0以上的版本中,我们在style中可以查看默认的dialog风格,
其实有设置dialog的一些属性,自己定义一种类型的dialog,
然后继承就可以修改整体dialog中的风格了,
默认动画,背景颜色,或者宽度之类的都是可以的
如下:
//Theme.AppCompat.Dialog主题常用的一般有以下属性:
- @android:color/transparent
- @null
- true
- true
- true
- @android:color/transparent
- true
- 0.5
根据这些属性我们可以操作布局控件,设置大小,或者继承一个dialog在代码中设置
//给dialog设置弹出动画
getWindow().setWindowAnimations(R.style.dialog_animtion_style);
//设置dialog的大小
WindowManager.LayoutParams lp=getWindow().getAttributes();
lp.width=WindowManager.LayoutParams.MATCH_PARENT;
lp.height=WindowManager.LayoutParams.WRAP_CONTENT;
/*lp.gravity= Gravity.BOTTOM;*/
getWindow().setAttributes(lp);
由于dialog的默认效果是在中间显示,
有时候我们需要让他显示在顶部或者底部,
上面代码注释掉的地方可以修改gravity来达到效果。
有时候需要设置dialog的弹出和退出时候的动画,
其实也是在style中设置一下就行,这样就可以定义自己想要实现的效果
android 官方推荐使用DialogFragment 其原因就是方便管理 其实就是一个Fragment
并没有那么复杂 用起来很好用 你也来一起试试吧~!