code小生,一個專注 Android 領域的技術平臺
公眾號回復 Android 加入我的安卓技術群
作者:雪地里面曬太陽
鏈接:https://www.jianshu.com/p/895c9441c28b
聲明:本文來自雪地里面曬太陽
投稿,轉發(fā)等請聯(lián)系原作者授權
我一直覺得程序員就像詩人一樣,,敲代碼就像寫詩,好的代碼何嘗不是一首優(yōu)美的詩,!
所以我把項目中的視圖控制部分抽取出來,,單獨封裝成了UiStatus這個庫。希望可以幫助大家簡化這部分操作,,也希望對大家有用,。
優(yōu)點:
1.輕量:簡單且夠用?。?!
2.省內(nèi)存:使用ViewStub,,所有未使用到的狀態(tài)均不會初始化,減少視圖初始化開銷,。
3.解耦,、封裝:降低各種視圖狀態(tài)和業(yè)務層耦合,使用者只需要關心業(yè)務層邏輯而無需知道視圖狀態(tài)管理內(nèi)部邏輯,。
4.自由:不提供任何狀態(tài)視圖,,高度可配置,完全由開發(fā)者自己定義,。
5.強大:可以使用在任何Activity,、Fragment、View當中,。
目前該庫包含的狀態(tài)有9種:
|: 常量名稱 :|: 含義 :|: 使用場景 :|
| LOADING | 加載中| 頁面加載中狀態(tài) |
| NETWORK_ERROR | 網(wǎng)絡錯誤 | 當網(wǎng)絡連接錯誤時展示的界面 |
| LOAD_ERROR | 加載失敗 | 接口請求失敗時展示給用戶的界面 |
| EMPTY | 空布局 | 當獲取的數(shù)據(jù)為空時展示的界面 |
| NOT_FOUND | 未找到內(nèi)容布局 | 有時獲取的內(nèi)容已被服務器刪除,,此時展示給用戶一個404內(nèi)容被刪除的界面 |
| CONTENT|內(nèi)容 | 真正需要展示給用戶的內(nèi)容視圖,也是開發(fā)者在layout里實際布局的視圖 |
| WIDGET_NETWORK_ERROR | 網(wǎng)絡錯誤小部件 | 一個類似于QQ,、微信斷網(wǎng)時頂部顯示的網(wǎng)絡錯誤提示視圖 |
| WIDGET_ELFIN | 小精靈(提示布局) | 一種頂部出現(xiàn)的提示布局,,可以做類似于簡書刷新時提醒推薦內(nèi)容條數(shù)的小部件 |
| WIDGET_FLOAT | 底部Float | 一種底部彈出的浮動布局,可以實現(xiàn)底部彈出小組件的功能 |
在這里我們將前6種狀態(tài)稱之為普通狀態(tài)視圖,,后面3種統(tǒng)稱為Widget小部件,。下文不再贅述!
其中,,普通狀態(tài)視圖不會同時顯示,,Widget小部件狀態(tài)的顯示和前6種狀態(tài)不沖突(可以同時顯示),
視圖層次上Widget在普通狀態(tài)視圖之上,,WIDGET_ELFIN在WIDGET_NETWORK_ERROR之下,。
使用步驟
1.添加依賴
step one:
allprojects {
repositories {
maven { url 'https://www.' }
}
}
step two :
dependencies {
implementation 'com.github.FengChenSunshine:UiStatus:{version}'
}
2.全局配置
UiStatus庫不提供任何狀態(tài)的視圖,完全由開發(fā)者自己自定義提供,。
①.獲取全局視圖控制管理者.
UiStatusManager.getInstance()
②.配置狀態(tài)視圖.
/**
* @params uiStatus 視圖狀態(tài).
* @params layoutResId 開發(fā)者自定義的該狀態(tài)視圖.
*/
addUiStatusConfig(@UiStatus int uiStatus, @LayoutRes int layoutResId);
/**
* @params uiStatus 視圖狀態(tài).
* @params layoutResId 開發(fā)者自定義的該狀態(tài)視圖.
* @params retryTriggerViewId 該狀態(tài)視圖上點擊事件的觸發(fā)控件id.
* @params retryListener 點擊事件觸發(fā)后的回調(diào).
*/
addUiStatusConfig(@UiStatus int uiStatus, @LayoutRes int layoutResId, @IdRes int retryTriggerViewId, OnRetryListener retryListener);
/**
* 該方法只針對Widget相關狀態(tài)有效.
* @params uiStatus 視圖狀態(tài).
* @params topMarginPx widget相對于內(nèi)容視圖的頂部距離,比如可能需要預留出頂部Toolbar高度的距離.
* @params bottomMarginPx widget相對于內(nèi)容視圖的底部距離,比如可能需要預留出底部導航欄高度的距離.
*/
setWidgetMargin(@UiStatus @IntRange(from = 7L,to = 9L) int uiStatus, int topMarginPx, int bottomMarginPx);
③.配置網(wǎng)絡狀態(tài)提供者.
考慮到開發(fā)者項目中都有自己的網(wǎng)絡狀態(tài)監(jiān)聽,、判斷的工具類,
所以UiStatus沒有必要額外編輯這段功能代碼,,僅需要開發(fā)者配置一個回調(diào)即可,。
配置網(wǎng)絡狀態(tài)提供者后,在請求顯示普通的狀態(tài)時如果是沒有網(wǎng)絡那么將自動重定向到NETWORK_ERROR網(wǎng)絡錯誤狀態(tài)界面,。
具體配置方法如下:
UiStatusNetworkStatusProvider
.getInstance()
.registerOnRequestNetworkStatusEvent(OnRequestNetworkStatusEvent networkStatusEvent);
3.具體使用
UiStatus可以使用在任何Activity,、View以及Fragment中.
①.Activity中:
UiStatusController.get().bind(activity);
②.View中:
UiStatusController.get().bind(view);
③.Fragment中:
由于Fragment的特殊性,所以這里稍微麻煩一點點:
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view;
//你的視圖初始化...
mUiStatusController = UiStatusController.get();
return mUiStatusController.bindFragment(view);
}
看以看出這里是使用 bindFragment(view) 方法將原本的內(nèi)容視圖傳遞給UiStatus,,并將該方法返回的控件作為 onCreateView 的返回值即可,。
④.視圖狀態(tài)切換:
對于普通視圖切換使用
UiStatusController.changeUiStatusIgnore(uiStatus)切換,;
對于Widget視圖使用UiStatusController.showWidget(uiStatus)
進行顯示;
或者使用其重載方法showWidget(uiStatus,duration)
方法進行顯示,,使用該方法時會在duration時間后自動隱藏,;
也可以使用UiStatusController.hideWidget()
方法進行隱藏Widget小部件。
4.成功
經(jīng)過上面的步驟之后您已經(jīng)成功的集成并且可以使用UiStatus庫了,,并且您肯定也看到了想要看到的各種狀態(tài)下的視圖成功切換,。
如果您不需要某些頁面的個性化定制,那么到這里就OK了,;否則請看下面的步驟會滿足你的需求,。
5.個性化配置
一般情況下使用在Application中的全局配置已經(jīng)能滿足大部分頁面視圖狀態(tài)的需求,
如果某些個別界面需要特殊配置那么UiStatus也是支持的,。
只需要使用持有的UiStatusController對象,調(diào)用其addUiStatusConfig()或其他任何可以在全局配置中使用的方法重新配置即可,。
6.優(yōu)化
一般的開發(fā)者只需要在自定義的Application中全局配置一次即可,,并且對于LOADING、LOAD_ERROR,、EMPTY,、NOT_FOUND、CONTENT這些普通視圖的切換可以下沉到 統(tǒng)一在基類Activity,、Fragment或者網(wǎng)絡加載框架中處理,,具體使用大同小異,可參考Demo,,這里不再贅述,。
7.UiStatus可實現(xiàn)效果部分展示
注:圖片來自其他APP,僅供參考實現(xiàn)效果使用,。其他未列出效果不代表不能實現(xiàn),,具體可實現(xiàn)效果盡情發(fā)揮想象!??!
最后附上github鏈接,喜歡的可以點個贊
https://github.com/FengChenSunshine/UiStatus
智能推薦
MusicLibrary:一個豐富的音樂播放封裝庫
Android 基于 glide 4.0 封裝圖片加載庫
少年郎,,你需要封裝好的 ViewPager 工具類
是時候該封裝一個自己的庫了