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,留言評論吧!