解析AndroidProject 對話框案例 dialog

“但願人長久,搬磚不再有”,輪子哥的座右銘。然後我卻把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中使用,在其他類中也可以達到複用的效果(後面再進行拆分)。

我開始看不懂了······我要慌了

 

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