Android自定義Dialog

Android中經常會需要使用到Dialog,但是每個項目的Dialog樣式也就那麼幾種,那麼我們完全可以仿AlertDialog自定義符合自己需求的Dialog。不僅能學習源碼的設計模式,又能快速完成項目需求,真是一舉數得呀!廢話不多說,切入正題吧!

AlertDialog的簡單使用如下:

private void showDeleteDialog() {
    AlertDialog.Builder builder = new AlertDialog.Builder(this)
            .setMessage("確認刪除?")
            .setCancelable(true)
            .setPositiveButton("確認", (dialog, which) -> {
                //確認刪除的邏輯代碼
                delete();
                dialog.dismiss();
            })
            .setNegativeButton("取消", (dialog, which) -> dialog.dismiss());
    AlertDialog alertDialog = builder.create();
    alertDialog.show();
    alertDialog.getButton(AlertDialog.BUTTON_POSITIVE).setTextColor(getResources().getColor(R.color.color_E8340C));
    alertDialog.getButton(AlertDialog.BUTTON_NEGATIVE).setTextColor(getResources().getColor(R.color.color_3D3D3D));
}

分析:AlertDialog是通過builder.create()創建的,在AlertDialog.Builder設置了一些相關屬性,例如:標題、內容、按鈕等...
點擊AlertDialog.Builder查看源碼,只有兩個屬性,瞬間是不是就懵逼了!其實它只是又做了一次封裝,將所有的參數放到了       AlertParams裏面,在構造方法裏面去創建了AlertParams對象,再通過這個對象去設置屬性。分析完了,那我們開始依葫蘆畫瓢唄!
 

//配置參數的類

public class LoadingDialogConfig {
    public Context context;
    public String msg;
    public int textColor;
    public int textSize;
}

//自定義Dialog類

public class LoadingDialog extends Dialog {

    private Buidler buidler;

    private LoadingDialog(Context context, Buidler buidler) {
        super(context);
 
        this.buidler = buidler;
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        View v = View.inflate(buidler.context, R.layout.layout_loading_dialog, null);                setContentView(v);
        TextView tvContent = v.findViewById(R.id.tvContent);
        if (buidler.getMsg() != null) {
            tvContent.setText(buidler.getMsg());
        }

        if (buidler.getTextSize() != 0) {
            tvContent.setTextSize(buidler.getTextSize());
        }

        if (buidler.getTextColor() != 0) {
            tvContent.setTextColor(buidler.getTextColor());
        }

    }


    public static class Buidler {

        LoadingDialogConfig loadingDialogConfig = new LoadingDialogConfig();

        public Buidler(Context context) {
            loadingDialogConfig.context = context;
        }

        public Buidler setTextSize(int size) {
            loadingDialogConfig.textSize = size;
            return this;
        }

        int getTextSize() {
            return loadingDialogConfig.textSize;
        }

        public Buidler setTextColor(int color) {
            loadingDialogConfig.textColor = color;
            return this;
        }

        int getTextColor() {
            return loadingDialogConfig.textColor;
        }

        public Buidler setMsg(String msg) {
            loadingDialogConfig.msg = msg;
            return this;
        }

        String getMsg() {
            return loadingDialogConfig.msg;
        }

        public LoadingDialog create() {
            return new LoadingDialog(loadingDialogConfig.context, this);
        }

    }
}

下面是使用:

val dialog: LoadingDialog = LoadingDialog.Buidler(this)
    .setMsg("加載中.............")
    .setTextSize(50)
    .setTextColor(resources.getColor(R.color.colorPrimaryDark))
    .create()

dialog.show()

這裏我只是寫了一個簡單的Demo,幫大家分析Android源碼。謝謝大家閱讀,如果需要更多簡單的分析源碼的Demo,留言評論吧!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章