代码地址如下:
http://www.demodashi.com/demo/12844.html
前言
之前写过一篇dialogFragmnet封装默认dialog的文章
DialogFragment创建默认dialog
这篇将介绍用dialogFragment创建dialog的另一种方式,将使dialog使用更加便捷,更加灵活。
程序实现
一.提前配置
此demo使用到了butterKnife,首先大家需要在自己app module中配置butterKnife,如下:
//butterKnife
compile 'com.jakewharton:butterknife:8.5.1'
//这条千万不能忘记!!
annotationProcessor 'com.jakewharton:butterknife-compiler:8.5.1'
二.继承AppCompatDialogFragment封装一个AppDialogFragment类
AppDialogFragment通过重写dialogFragment的onCreateView方法来达到自定义布局的效果,这样就能使布局更灵活
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
mLayoutView = inflater.inflate(getLayoutId(), container, false);
mUnbinder= ButterKnife.bind(this,mLayoutView);//绑定framgent
//初始化
onCreateFragmentView(inflater, container, savedInstanceState);
return mLayoutView;
}
然后在 onCreateFragmentView 方法中做一些涉及到 dialog相关的数据初始化
为了控制dialog大小,我们需要在AppDialogFragment的onStart方法中做些控制dialog大小的代码:
@Override
public void onStart() {
super.onStart();
//设置窗口属性
setDialog();
}
/**设置窗口属性**/
private void setDialog(){
Dialog dialog=getDialog();
if(dialog!=null) {
//返回键是否消失
// getDialog().setCancelable(mBackCancel);
dialog.setOnKeyListener(new DialogInterface.OnKeyListener() {
@Override
public boolean onKey(DialogInterface dialogInterface, int keyCode, KeyEvent keyEvent) {
if (keyCode == KeyEvent.KEYCODE_BACK) {
return !mBackCancel;
}
return false;
}
});
//触碰dialog外面是否消失
dialog.setCanceledOnTouchOutside(mTouchOutsideCancel);
//设置窗口大小
setWindowSize(dialog);
}
}
最终达到的效果是将dialog的大小封装到一个double数组中
最后在AppDialogFragment中写一些基本的属性设置
//设置dialog背景色
setBackGroundId(int rId)
//设置点击返回键是否关闭dialog
setCancel(boolean canDismiss)
//设置点击屏幕外面是否关闭dialog
setCancelOnTouchOutside(boolean canDismiss)
//显示dialog
showDialog(FragmentManager fragmentManager)
三.继承AppDialogFragment封装一个通用dialog---SyDialogFragment
3.1 SyDialogFragment特性
- 可设置dialog是否可点击返回键消失
- 可设置dialog是否可点击屏幕消失
- 当然是具备设置dialog大小的,但由于不想破坏其在app中统一性,于是固定大小了
- 可设置dialog背景色
- 可设置dialog标题栏的显示和隐藏
- 可设置dialog标题栏文字内容
- 可设置标题栏文字大小,颜色
- 可设置Content区文字内容
- 可设置Content区文字大小,颜色
- 可设置确认按钮的显示和隐藏
- 可设置确认按钮的文字内容,文字大小和文字颜色
- 可设置确认按钮的点击事件
- 可设置取消按钮的显示和隐藏
- 可设置取消按钮的文字内容,文字大小和文字颜色
- 可设置取消按钮的点击事件
3.2 SyDialogFragment的运用
在要使用的地方调用:
SyDialogFragment mSyDialogFragment=new SyDialogFragment();
mSyDialogFragment.setBackGroundColor(R.color.white)//默认背景白色,在SyDialogFragment中设置
.setTitle(true)//默认显示标题栏
.setTitleText("申请")//默认显示"提示",在xml中设置
.setTitleTextColor(R.color.blue)//默认黑色,在xml中设置
.setTitleTextSize(18f)//默认14sp,在xml中设置
.setMesssageText("你确定退出吗?")//默认显示"提示",在xml中设置
.setMesssageTextColor(R.color.black)//默认#666666,在xml中设置
.setMesssageTextSize(15f)//默认12sp,在xml中设置
.setCancelTextColor(R.color.color_1f1b24)//默认#68c81c,在xml中设置
.setCancelTextSize(16f)//默认14sp,在xml中设置
.setCancelBtn("cancel", new View.OnClickListener() {
@Override
public void onClick(View v) {//默认文字为“取消”,在xml中设置
ToastUtil.shortShow("取消");
mSyDialogFragment.dismiss();
}
})
.setConfirmTextColor(R.color.red)//默认#68c81c,在xml中设置
.setConfirmTextSize(16f)//默认14sp,在xml中设置
.setConfirmBtn("ok", new View.OnClickListener() {
@Override
public void onClick(View v) {//默认文字为“确定”,在xml中设置
ToastUtil.shortShow("确认");
mSyDialogFragment.dismiss();
}
})
.(false)//默认true
.setCancelOnTouchOutside(false)//默认true
.showDialog(getSupportFragmentManager());
3.3 SyDialogFragment使用注意事项
- setCancel(false)和setCancelOnTouchOutside(false)为SyDialogFragment父类方法,返回的是AppDialogFragment,所以SyDialogFragment在调用设置属性的时候,先调SyDialogFragment中的方法,最后设置setCancel,setCancelOnTouchOutside和showDialog
- SyDialogFragment默认不显示CancelBtn和ConfirmBtn,只有当你设置了setConfirmBtn方法后才会显示ConfirmBtn,CancelBtn同理
- 当只需要显示一个按钮的时候,不应该设置setConfirmBtn方法(避免布局错位),而应该设置setCancelBtn方法,并在setCancelBtn方法中去执行你的操作
四.自定义你的dialog
如果SyDialogFragment 仍无法满足你对dialog的需求,那么,你可以自定义自己的dialog
下面以自定义一个MyFragmentDialog来讲解下自定义dialog,继承AppDialogFragment写一个MyFragmentDialog,你可以类似这样:
package com.android.fr;
import android.view.View;
import android.widget.Button;
import com.android.base.ToastUtil;
import com.android.testdemo.R;
import butterknife.BindView;
/**
* Title:
* Description:
* <p>
* Created by pei
* Date: 2018/4/16
*/
public class MyFragmentDialog extends AppDialogFragment{
@BindView(R.id.btn_close)
Button mBtnClose;
@Override
protected double[] getWindowSize() {
return new double[]{0.5,0.5};
}
@Override
protected int getLayoutId() {
return R.layout.dialog_my_fragmnet;
}
@Override
protected void initData() {
}
@Override
protected void setListener() {
mBtnClose.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
ToastUtil.showShortToast("dialog关闭");
MyFragmentDialog.this.dismiss();
}
});
}
}
这里需要解释的是 getWindowSize() 方法,return的是一个 double数组,数组中第一个0.5表示dialog宽度为全屏宽度的0.5,数组中第二个0.5表示dialog 高度为全屏高度的0.5
如果需要dialog默认大小,你的getWindowSize()可以 这样写:
@Override
protected double[] getWindowSize() {
return new double[]{AppDialogFragment.WRAP_CONTENT,AppDialogFragment.WRAP_CONTENT};
}
如果要dialog全屏,你的你的getWindowSize()可以 这样写:
@Override
protected double[] getWindowSize() {
return new double[]{AppDialogFragment.MATCH_PARENT,AppDialogFragment.MATCH_PARENT};
}
在使用时,你可以这样:
new MyFragmentDialog().setCancel(false)
.setCancelOnTouchOutside(false)
.showDialog(getSupportFragmentManager());
项目结构图和效果图
项目结构图
运行效果图
自定义通用dialogFragment
代码地址如下:
http://www.demodashi.com/demo/12844.html
注:本文著作权归作者,由demo大师代发,拒绝转载,转载需要作者授权