PageStatusTransformer:一種Android低入侵性的頁面狀態(tài)切換管理

頁面狀態(tài)切換

PageStatusTransformer.gif

特性

  • 構(gòu)造自定義狀態(tài)
val transformer =
    PageStatusTransformer.newInstance {

        "普通狀態(tài)" { 
            SimpleStatus(contentView)
        }

        "加載中" {
            MyLoadingPageStatus()
        }

        "沒有數(shù)據(jù)" {
            MyEmptyPageStatus()
        }

        //可以是任意字符串 "StatusName" { 對應(yīng)的View }
        //或者是任意枚舉 Enum { 對應(yīng)的View }
        "數(shù)據(jù)錯(cuò)誤" {
            MyErrorPageStatus()
        }
    }
    
//當(dāng)需要切換狀態(tài)時(shí),直接切換對應(yīng)的狀態(tài)名字:
transformer.transform("沒有數(shù)據(jù)")
//或者枚舉
transformer.transform(YourCustomEnum.Status1)

可以通過字符串或枚舉自定義任意狀態(tài),無須受 showLoading showError 這種死板的接口約束,根據(jù)業(yè)務(wù)場景需要而構(gòu)造當(dāng)前頁面的狀態(tài)。

  • 指定替換原來的 View
PageStatusTransformer.newInstance(
    replaceTo = contentView /*contentView會(huì)被替換成同等大小的其他狀態(tài)的ui*/
) { 
    Status1 {...}
    Status2 {...}
}

通過可選參數(shù) replaceTo 指定原有頁面的 View ,當(dāng)發(fā)生狀態(tài)切換時(shí),新狀態(tài)的 View 會(huì)動(dòng)態(tài)替換舊狀態(tài)上的 View。所以無須在XML中放一個(gè)所謂的 StatusLayout,也無須把業(yè)務(wù)的狀態(tài)都塞到 BaseActivity/BaseFragment 中。

  • 支持不同方式的ui切換
PageStatusTransformer.newInstance(...) { 
    Status1 {
        //`SimpleStatus` 只會(huì)改變View的可見性
        //當(dāng)需要顯示這個(gè)狀態(tài)時(shí)就Visible,當(dāng)不需要的時(shí)候就Gone
        SimpleStatus(view) 
    }
    Status2 {
        //`ViewStubStatus` 會(huì)在狀態(tài)需要顯示時(shí)才`inflate`對應(yīng)的`ViewStub`
        //當(dāng)不需要的時(shí)候就Gone
        ViewStubStatus(viewStub)
    }
    Status3 {
        //`ReplacementViewStatus` 會(huì)在狀態(tài)需要顯示時(shí)通過 `addView` 添加到布局當(dāng)中,
        //在狀態(tài)不需要的時(shí)候 `removeView` 移除
        ReplacementViewStatus(view)
    }
}

支持只改變狀態(tài)ui的可見性,適用于長期存在于布局中的狀態(tài),比如數(shù)據(jù)正常時(shí)的狀態(tài)。
支持當(dāng)使用時(shí)才渲染的ViewStub,適用于懶加載布局中的狀態(tài)。
支持動(dòng)態(tài)添加和移除狀態(tài)ui,適用于短暫存在于布局中的臨時(shí)狀態(tài)。

  • 自定義狀態(tài)的ui
PageStatusTransformer.newInstance(replaceTo = ...) { 
    "狀態(tài)1" {
        object: PageDisplayStatus {
            override fun showView(){
                //每次切換到`Status1`時(shí)都會(huì)觸發(fā)
                //完全自定義如何去顯示這個(gè)狀態(tài)
            }
            
            override fun hideView(){
                //每次切換到除`Status1`以外的狀態(tài)都會(huì)觸發(fā)
                //完全自定義如何去隱藏這個(gè)狀態(tài)
            }
        }
    }
    "狀態(tài)2" {
        object: ReplacementViewStatus() {
            override fun inflateView(inflater: LayoutInflater, parent: ViewGroup): View {
                //切換到`Status2`時(shí)觸發(fā)渲染一個(gè)新布局,并動(dòng)態(tài)`addView`到`replaceTo`參數(shù)指定的位置
                return inflater.inflate(...., parent, false)
            }
        
            //每次切換到`Status2`時(shí)都會(huì)觸發(fā)
            override fun onViewShow(){...}

            //每次切換到除`Status2`以外的狀態(tài)都會(huì)觸發(fā)
            override fun onViewHide(){...}
        }
    }
    ...
}

與其他方案對比

目前項(xiàng)目中使用的API都是類似于 showLoading(@resId int id, String text) ,但新一期需求設(shè)計(jì)出的loading提示/空數(shù)據(jù)提示/網(wǎng)絡(luò)異常提示都是復(fù)雜的動(dòng)畫。以前的接口完全不能滿足,而且對BaseFragment改動(dòng)很大。一個(gè)本來很小的需求,就影響到接口設(shè)計(jì),所以干脆重做了狀態(tài)切換這一塊。
所以千萬不要把這些狀態(tài)切換代碼塞到 BaseFragment 中,千萬不要把ui下沉,千萬不要二次封裝。

對Java支持

通過JavaViewStatusBuilder來把弱雞Java適配到Kotlin DSL:

PageStatusTransformer transformer = PageStatusTransformer.newInstance(mRecyclerView, 
    new JavaViewStatusBuilder()
        .putStatus("Normal", SimpleStatus(mRecyclerView))
        .putStatus("Empty", YouCustomStatus("暫無數(shù)據(jù)"))
        .putStatus("Error", YouCustomStatus("網(wǎng)絡(luò)錯(cuò)誤"))
        .putStatus("Loading",YouCustomStatus("加載中"))
        .build()
);


transformer.transform("Empty");

安裝

allprojects {
    repositories {
        ...
        maven { url 'https://jitpack.io' }
    }
}
dependencies {
    implementation 'com.github.YvesCheung:PageStatusTransformer:1.0.0'
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容