“但願人長久,搬磚不再有”,輪子哥的座右銘。然後我卻把AndroidProject功能解析出來,是爲了更好的搬磚,我想他看到是不是會當場吐血。🤣
對於對話框案例,我已經很難只是把代碼貼出來,方便其他項目使用。整理了上方的導圖,一個MessageDialog牽扯到的全部文件。這裏更多的是,我們要學習裏面一些代碼處理的點,以及封裝方式。我們也許可以用一個Java文件和xml佈局文件實現的事情,卻用這麼多代碼實現的意義和好處。但考慮這些的前提都是,學習他的代碼。
兩個layout結合顯示完整的效果 layout.addView
結合上方導圖,可以看到有兩個文件 R.layout.ui_dialog 和R.layout.message_dialog。內容分別是:
R.layout.ui_dialog
R.layout.message_dialog
實際顯示效果
結合方式 CommonDialog 56行
public B setCustomView(View view) {
mContainerLayout.addView(view, 1);
return (B) this;
}
通過MessageDialog調用CommonDialog內方法進行把內容的佈局 addView 進去,這樣其他的彈出框只是內容不同,標題和按鈕部分相同,以達到複用的效果。
CardView
在ui_dialog.xml 佈局中使用了控件 CardView 來實現 Dialog 圓角效果。帶圓角背景和陰影的FrameLayout。並且在CardView中使用 ImageView 可以直接顯示圓角圖片。
參考博客:Android之CardView (Ps:寫的真的很好)
核心屬性
背景顏色
app:cardBackgroundColor="@color/white"
圓角半徑
app:cardCornerRadius="15dp"
陰影大小
app:cardElevation="0px"
SmartTextView 自定義View
可根據內容自定義顯示和隱藏的控件
package com.hjq.widget.view;
import android.content.Context;
import android.text.TextUtils;
import android.util.AttributeSet;
import androidx.appcompat.widget.AppCompatTextView;
/**
* author : Android 輪子哥
* github : https://github.com/getActivity/AndroidProject
* time : 2019/08/18
* desc : 自動顯示和隱藏的 TextView
*/
public final class SmartTextView extends AppCompatTextView {
public SmartTextView(Context context) {
this(context, null);
}
public SmartTextView(Context context, AttributeSet attrs) {
this(context, attrs, android.R.attr.textViewStyle);
}
public SmartTextView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
@Override
public void setText(CharSequence text, BufferType type) {
super.setText(text, type);
// 判斷當前有沒有設置文本達到自動隱藏和顯示的效果
if (TextUtils.isEmpty(text) && getVisibility() != GONE) {
setVisibility(GONE);
return;
}
if (getVisibility() != VISIBLE) {
setVisibility(VISIBLE);
}
}
}
@drawable/transparent_selector
確定、取消按鈕的按壓樣式
<?xml version="1.0" encoding="utf-8"?>
<!-- 透明背景按壓效果樣式 -->
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<!-- 按壓狀態 -->
<item android:drawable="@color/black5" android:state_pressed="true" />
<!-- 選中狀態 -->
<item android:drawable="@color/black5" android:state_selected="true" />
<!-- 焦點狀態 -->
<item android:drawable="@color/black5" android:state_focused="true" />
<!-- 默認狀態 -->
<item android:drawable="@color/transparent" />
</selector>
MessageDialog在Activity中的使用
// 消息對話框
new MessageDialog.Builder(getActivity())
// 標題可以不用填寫
.setTitle("我是標題")
// 內容必須要填寫
.setMessage("我是內容")
// 確定按鈕文本
.setConfirm(getString(R.string.common_confirm))
// 設置 null 表示不顯示取消按鈕
.setCancel(getString(R.string.common_cancel))
// 設置點擊按鈕後不關閉對話框
//.setAutoDismiss(false)
.setListener(new MessageDialog.OnListener() {
@Override
public void onConfirm(BaseDialog dialog) {
toast("確定了");
}
@Override
public void onCancel(BaseDialog dialog) {
toast("取消了");
}
})
.show();
個人結構分析
顯然如果把這樣一個大批量代碼移植到新的項目裏,好像是不太現實,還有一些基本資源 string、color等的定義。
1、MessageDialog 設置Dialog內容佈局,接收ac的Dialog內容以及按鈕接口實現類的傳入
2、CommonDialog 設置相同Dialog的佈局,將子類佈局插入到Common的Dialog佈局中,並接收按鈕接口實現類的傳入
3、BaseDialog 定義Dialog style 顯示大小位置以及 真正的綁定按鈕的點擊事件。BaseDialog應該是這個Dialog 的核心,這裏採用的是BaseActivity extends AppCompatDialog 的形式,再通過BaseActivity.Builder去構建Dialog對象,並且實現了大量的接口,這些接口不只是在BaseDialog中使用,在其他類中也可以達到複用的效果(後面再進行拆分)。
我開始看不懂了······我要慌了