DialogFragment(四)——自定义通用dialogFragment

前言

相信大家在做项目的时候,都会用到一些提示网络状况,是否更新app啊啥的需要与用户进行互动的提示框。我们希望能有一个统一的提示框dialog,能英应对各种app中需要的一般性提示。当然,我在DialogFragment(二)——创建默认dialogFragment一文中已经实现了提示框的统一性,但其自由与可控性还不够,于是我写了一个新的dialogFragment--------SyDialogFragment。

今天涉及到的知识有:

  • SyDialogFragment特性
  • SyDialogFragment代码
  • SyDialogFragment的使用
一.SyDialogFragment特性

SyDialogFragment具备以下特征:

  1. 可设置dialog是否可点击返回键消失
  2. 可设置dialog是否可点击屏幕消失
  3. 当然是具备设置dialog大小的,但由于不想破坏其在app中统一性,于是固定大小了
  4. 可设置dialog背景色
  5. 可设置dialog标题栏的显示和隐藏
  6. 可设置dialog标题栏文字内容
  7. 可设置标题栏文字大小,颜色
  8. 可设置Content区文字内容
  9. 可设置Content区文字大小,颜色
  10. 可设置确认按钮的显示和隐藏
  11. 可设置确认按钮的文字内容,文字大小和文字颜色
  12. 可设置确认按钮的点击事件
  13. 可设置取消按钮的显示和隐藏
  14. 可设置取消按钮的文字内容,文字大小和文字颜色
  15. 可设置取消按钮的点击事件
二.SyDialogFragment代码

由于SyDialogFragment具备超级灵活性,故其来自于自定义DialogFragment,所以需要继承父类AppDialogFragment,AppDialogFragment在上一节已经讲过了,这里就不赘述了,下面直接上SyDialogFragment代码:

package com.dialogfragmentdemo;

import android.view.View;
import android.widget.Button;
import android.widget.TextView;

import com.dialogfragmentdemo.base.AppDialogFragment;
import com.dialogfragmentdemo.util.LogUtil;

import butterknife.BindView;

/**
 * Title:自定义通用dialogFragment,继承于AppDialogFragment
 * Description:
 * <p>
 * Created by pei
 * Date: 2017/12/26
 */
public class SyDialogFragment extends AppDialogFragment {

    @BindView(R.id.tv_title)
    TextView mTvTitle;
    @BindView(R.id.tv_content)
    TextView mTvContent;
    @BindView(R.id.btn_confirm)
    Button mBtnConfirm;
    @BindView(R.id.btn_cancel)
    Button mBtnCancel;

    private int mBackGroundColor=R.color.white;//默认dialog背景色
    private boolean isTitle=true;//默认有标题栏
    private String mTitleText;//默认标题栏文字在xml中设置
    private int mTitleTextColor= super.RID;//默认标题栏文字颜色在xml中设置
    private float mTitleTextSize=super.RID;//默认标题栏文字大小在xml中设置
    private String mContentText;//默认内容区文字在xml中设置
    private int mContentTextColor=super.RID;//默认内容区文字颜色在xml中设置
    private float mContentTextSize=super.RID;//默认内容区文字大小在xml中设置
    private String mConfirmText;//默认确认按钮文字在xml中设置
    private int mConfirmTextColor=super.RID;//默认确认按钮文字颜色在xml中设置
    private float mConfirmTextSize=super.RID;//默认确认按钮文字大小在xml中设置
    private String mCancelText;//默认取消按钮文字在xml中设置
    private int mCancelTextColor=super.RID;//默认取消按钮文字颜色在xml中设置
    private float mCancelTextSize=super.RID;//默认取消按钮文字大小在xml中设置

    private boolean isConfirmBtn;//默认不显示确认按钮
    private boolean isCancelBtn;//默认不显示取消按钮

    private View.OnClickListener mOnConfirmClickListener;
    private View.OnClickListener mOnCancelClickListener;


    @Override
    protected double[] getWindowSize() {
        return new double[]{0.9,0.28};
    }

    @Override
    protected int getLayoutId() {
        return R.layout.dialog_fragment_sy;
    }

    @Override
    protected void initData() {
        LogUtil.e(SyDialogFragment.class,"=======我是标题栏啊=====");
        //设置默认背景色
        super.mBackGroundId=mBackGroundColor;
        super.setBackGroundId(mBackGroundId);
        //标题栏显隐
        if(!isTitle){
            mTvTitle.setVisibility(View.GONE);
        }
        //设置标题栏文字
        if(mTitleText!=null){
            mTvTitle.setText(mTitleText);
        }
        //标题栏文字颜色
        if(mTitleTextColor!=super.RID){
            mTvTitle.setTextColor(mContext.getResources().getColor(mTitleTextColor));
        }
        //设置标题栏文字大小
        if(mTitleTextSize!=super.RID){
            mTvTitle.setTextSize(mTitleTextSize);
        }
        //设置内容区文字
        if(mContentText!=null){
            mTvContent.setText(mContentText);
        }
        //内容区文字颜色
        if(mContentTextColor!=super.RID){
            mTvContent.setTextColor(mContext.getResources().getColor(mContentTextColor));
        }
        //内容区文字大小
        if(mContentTextSize!=super.RID){
            mTvContent.setTextSize(mContentTextSize);
        }
        //设置确认按钮文字
        if(mConfirmText!=null){
            mBtnConfirm.setText(mConfirmText);
        }
        //设置确认按钮文字颜色
        if(mConfirmTextColor!=super.RID){
            mBtnConfirm.setTextColor(mContext.getResources().getColor(mConfirmTextColor));
        }
        //设置确认按钮文字大小
        if(mConfirmTextSize!=super.RID){
            mBtnConfirm.setTextSize(mConfirmTextSize);
        }
        //设置取消按钮文字
        if(mCancelText!=null){
            mBtnCancel.setText(mCancelText);
        }
        //设置取消按钮文字颜色
        if(mCancelTextColor!=super.RID){
            mBtnCancel.setTextColor(mContext.getResources().getColor(mCancelTextColor));
        }
        //设置取消按钮文字大小
        if(mCancelTextSize!=super.RID){
            mBtnCancel.setTextSize(mCancelTextSize);
        }
        //确认按钮显隐
        if(isConfirmBtn){
            mBtnConfirm.setVisibility(View.VISIBLE);
        }else{
            mBtnConfirm.setVisibility(View.GONE);
        }
        //取消按钮显隐
        if(isCancelBtn){
            mBtnCancel.setVisibility(View.VISIBLE);
        }else{
            mBtnCancel.setVisibility(View.GONE);
        }

    }

    @Override
    protected void setListener(){
         if(mBtnConfirm.getVisibility()==View.VISIBLE){
             mBtnConfirm.setOnClickListener(this);
         }
        if(mBtnCancel.getVisibility()==View.VISIBLE){
            mBtnCancel.setOnClickListener(this);
        }
    }

    @Override
    public void onClick(View v) {
        super.onClick(v);
        switch (v.getId()) {
            case R.id.btn_confirm:
                if(mOnConfirmClickListener!=null){
                    mOnConfirmClickListener.onClick(v);
                }
                break;
            case R.id.btn_cancel:
                if(mOnCancelClickListener!=null){
                    mOnCancelClickListener.onClick(v);
                }
                break;
            default:
                break;
        }
    }

    /**设置dialog背景色**/
    public SyDialogFragment setBackGroundColor(int color){
        this.mBackGroundColor=color;
        return this;
    }

    /**设置标题栏**/
    public SyDialogFragment setTitle(boolean isTitle){
        this.isTitle=isTitle;
        return this;
    }

    /**设置标题栏文字**/
    public SyDialogFragment setTitleText(String message){
        this.mTitleText=message;
        return this;
    }

    /**设置标题栏文字颜色**/
    public SyDialogFragment setTitleTextColor(int color){
        this.mTitleTextColor=color;
        return this;
    }

    /**设置标题栏文字大小**/
    public SyDialogFragment setTitleTextSize(float size){
        this.mTitleTextSize=size;
        return this;
    }

    /**设置内容区文字**/
    public SyDialogFragment setMesssageText(String message){
        this.mContentText=message;
        return this;
    }

    /**设置内容区文字颜色**/
    public SyDialogFragment setMesssageTextColor(int color){
        this.mContentTextColor=color;
        return this;
    }

    /**设置内容区文字大小**/
    public SyDialogFragment setMesssageTextSize(float size){
        this.mContentTextSize=size;
        return this;
    }

    /**确认点击事件**/
    public SyDialogFragment setConfirmBtn(View.OnClickListener onClickListener){
        isConfirmBtn=true;
        this.mOnConfirmClickListener=onClickListener;
        return this;
    }

    /**确认点击事件,可设置文字**/
    public SyDialogFragment setConfirmBtn(String text,View.OnClickListener onClickListener){
        this.mConfirmText=text;
        setConfirmBtn(onClickListener);
        return this;
    }

    /**设置确认按钮文字颜色**/
    public SyDialogFragment setConfirmTextColor(int color){
        this.mConfirmTextColor=color;
        return this;
    }

    /**设置确认按钮文字大小**/
    public SyDialogFragment setConfirmTextSize(float size){
        this.mConfirmTextSize=size;
        return this;
    }

    /**取消点击事件**/
    public SyDialogFragment setCancelBtn(View.OnClickListener onClickListener){
        isCancelBtn=true;
        this.mOnCancelClickListener=onClickListener;
        return this;
    }

    /**取消点击事件,可设置文字**/
    public SyDialogFragment setCancelBtn(String text,View.OnClickListener onClickListener){
        this.mCancelText=text;
        setCancelBtn(onClickListener);
        return this;
    }

    /**设置取消按钮文字颜色**/
    public SyDialogFragment setCancelTextColor(int color){
        this.mCancelTextColor=color;
        return this;
    }

    /**设置确认按钮文字大小**/
    public SyDialogFragment setCancelTextSize(float size){
        this.mCancelTextSize=size;
        return this;
    }

}

三.SyDialogFragment对应的dialog_fragment_sy.xml布局代码
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:bao="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingLeft="15dp"
    android:paddingRight="15dp"
    android:gravity="center"
    android:orientation="vertical">

    <TextView
        android:id="@+id/tv_title"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:ellipsize="end"
        android:gravity="center_vertical"
        android:maxLines="1"
        android:minHeight="50dp"
        android:singleLine="true"
        android:text="提示"
        android:textColor="#000000"
        android:textSize="14sp" />

    <TextView
        android:id="@+id/tv_content"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1.0"
        android:layout_marginTop="15dp"
        android:layout_marginBottom="15dp"
        android:text="提示"
        android:textColor="#666666"
        android:textSize="12sp" />

    <RelativeLayout
        android:id="@+id/rl_btn"
        android:layout_width="match_parent"
        android:layout_height="50dp">

        <Button
            android:id="@+id/btn_confirm"
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:layout_alignParentBottom="true"
            android:layout_toLeftOf="@+id/btn_cancel"
            android:background="@color/transparent"
            android:paddingLeft="5dp"
            android:paddingRight="5dp"
            android:gravity="center"
            android:text="确定"
            android:textColor="#68c81c"
            android:textSize="14sp"/>

        <Button
            android:id="@+id/btn_cancel"
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:layout_alignParentBottom="true"
            android:layout_alignParentRight="true"
            android:background="@color/transparent"
            android:paddingLeft="5dp"
            android:paddingRight="5dp"
            android:gravity="center"
            android:text="取消"
            android:textColor="#68c81c"
            android:textSize="14sp"/>

    </RelativeLayout>



</LinearLayout>


四.SyDialogFragment在MainActivity中的运用

以下为示例代码,大家可以根据实际情况酌情设置

//在MainActivity中声明对象
private SyDialogFragment mSyDialogFragment;

在要使用的地方调用:

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());

四.SyDialogFragment使用注意事项
  1. setCancel(false)和setCancelOnTouchOutside(false)为SyDialogFragment父类方法,返回的是AppDialogFragment,所以SyDialogFragment在调用设置属性的时候,先调SyDialogFragment中的方法,最后设置setCancel,setCancelOnTouchOutside和showDialog
  2. SyDialogFragment默认不显示CancelBtn和ConfirmBtn,只有当你设置了setConfirmBtn方法后才会显示ConfirmBtn,CancelBtn同理
  3. 当只需要显示一个按钮的时候,不应该设置setConfirmBtn方法(避免布局错位),而应该设置setCancelBtn方法,并在setCancelBtn方法中去执行你的操作
五.SyDialogFragment使用效果图
2.gif

ok,今天的内容就讲到这里啦,谢谢诶

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,117评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,328评论 1 293
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,839评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,007评论 0 206
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,384评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,629评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,880评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,593评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,313评论 1 243
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,575评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,066评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,392评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,052评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,082评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,844评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,662评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,575评论 2 270

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 170,569评论 25 707
  • ¥开启¥ 【iAPP实现进入界面执行逐一显】 〖2017-08-25 15:22:14〗 《//首先开一个线程,因...
    小菜c阅读 6,204评论 0 17
  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 11,615评论 4 59
  • 对话框 对话框是提示用户作出决定或输入额外信息的小窗口。 对话框不会填充屏幕,通常用于需要用户采取行动才能继续执行...
    牧童遥指2000阅读 3,728评论 6 11
  • 2017年11月27日感恩分享第439天: 【座右铭】 “我是一切的源头!” “相信就有奇迹!” 健康拍打第155...
    three胡阅读 408评论 0 0