解析AndroidProject 對(duì)話框案例 dialog

“但愿人長(zhǎng)久,搬磚不再有”,輪子哥的座右銘。然后我卻把AndroidProject功能解析出來(lái),是為了更好的搬磚,我想他看到是不是會(huì)當(dāng)場(chǎng)吐血。??
對(duì)于對(duì)話框案例,我已經(jīng)很難只是把代碼貼出來(lái),方便其他項(xiàng)目使用。整理了上方的導(dǎo)圖,一個(gè)MessageDialog牽扯到的全部文件。這里更多的是,我們要學(xué)習(xí)里面一些代碼處理的點(diǎn),以及封裝方式。我們也許可以用一個(gè)Java文件和xml布局文件實(shí)現(xiàn)的事情,卻用這么多代碼實(shí)現(xiàn)的意義和好處。但考慮這些的前提都是,學(xué)習(xí)他的代碼。
兩個(gè)layout結(jié)合顯示完整的效果 layout.addView
結(jié)合上方導(dǎo)圖,可以看到有兩個(gè)文件 R.layout.ui_dialog 和R.layout.message_dialog。內(nèi)容分別是:
R.layout.ui_dialog

R.layout.message_dialog

實(shí)際顯示效果

結(jié)合方式 CommonDialog 56行
public B setCustomView(View view) {
mContainerLayout.addView(view, 1);
return (B) this;
}
通過(guò)MessageDialog調(diào)用CommonDialog內(nèi)方法進(jìn)行把內(nèi)容的布局 addView 進(jìn)去,這樣其他的彈出框只是內(nèi)容不同,標(biāo)題和按鈕部分相同,以達(dá)到復(fù)用的效果。
CardView
在ui_dialog.xml 布局中使用了控件 CardView 來(lái)實(shí)現(xiàn) Dialog 圓角效果。帶圓角背景和陰影的FrameLayout。并且在CardView中使用 ImageView 可以直接顯示圓角圖片。
參考博客:Android之CardView (Ps:寫的真的很好)
核心屬性
背景顏色
app:cardBackgroundColor="@color/white"
圓角半徑
app:cardCornerRadius="15dp"
陰影大小
app:cardElevation="0px"
SmartTextView 自定義View
可根據(jù)內(nèi)容自定義顯示和隱藏的控件
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 : 自動(dòng)顯示和隱藏的 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);
// 判斷當(dāng)前有沒(méi)有設(shè)置文本達(dá)到自動(dòng)隱藏和顯示的效果
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">
<!-- 按壓狀態(tài) -->
<item android:drawable="@color/black5" android:state_pressed="true" />
<!-- 選中狀態(tài) -->
<item android:drawable="@color/black5" android:state_selected="true" />
<!-- 焦點(diǎn)狀態(tài) -->
<item android:drawable="@color/black5" android:state_focused="true" />
<!-- 默認(rèn)狀態(tài) -->
<item android:drawable="@color/transparent" />
</selector>
?如果是 TextView 需添加 android:clickable="true" 屬性才可奏效
MessageDialog在Activity中的使用
// 消息對(duì)話框
new MessageDialog.Builder(getActivity())
// 標(biāo)題可以不用填寫
.setTitle("我是標(biāo)題")
// 內(nèi)容必須要填寫
.setMessage("我是內(nèi)容")
// 確定按鈕文本
.setConfirm(getString(R.string.common_confirm))
// 設(shè)置 null 表示不顯示取消按鈕
.setCancel(getString(R.string.common_cancel))
// 設(shè)置點(diǎn)擊按鈕后不關(guān)閉對(duì)話框
//.setAutoDismiss(false)
.setListener(new MessageDialog.OnListener() {
@Override
public void onConfirm(BaseDialog dialog) {
toast("確定了");
}
@Override
public void onCancel(BaseDialog dialog) {
toast("取消了");
}
})
.show();
個(gè)人結(jié)構(gòu)分析
顯然如果把這樣一個(gè)大批量代碼移植到新的項(xiàng)目里,好像是不太現(xiàn)實(shí),還有一些基本資源 string、color等的定義。
1、MessageDialog 設(shè)置Dialog內(nèi)容布局,接收ac的Dialog內(nèi)容以及按鈕接口實(shí)現(xiàn)類的傳入
2、CommonDialog 設(shè)置相同Dialog的布局,將子類布局插入到Common的Dialog布局中,并接收按鈕接口實(shí)現(xiàn)類的傳入
3、BaseDialog 定義Dialog style 顯示大小位置以及 真正的綁定按鈕的點(diǎn)擊事件。BaseDialog應(yīng)該是這個(gè)Dialog 的核心,這里采用的是BaseActivity extends AppCompatDialog 的形式,再通過(guò)BaseActivity.Builder去構(gòu)建Dialog對(duì)象,并且實(shí)現(xiàn)了大量的接口,這些接口不只是在BaseDialog中使用,在其他類中也可以達(dá)到復(fù)用的效果(后面再進(jìn)行拆分)。

浙公網(wǎng)安備 33010602011771號(hào)