我一直以爲程序員就像詩人同樣,敲代碼就像寫詩,好的代碼未嘗不是一首優美的詩!git
因此我把項目中的視圖控制部分抽取出來,單獨封裝成了UiStatus這個庫。但願能夠幫助你們簡化這部分操做,也但願對你們有用。程序員
部分效果演示github
1.輕量:簡單且夠用!!!面試
2.省內存:使用ViewStub,全部未使用到的狀態均不會初始化,減小視圖初始化開銷。小程序
3.解耦、封裝:下降各類視圖狀態和業務層耦合,使用者只須要關心業務層邏輯而無需知道視圖狀態管理內部邏輯。性能優化
4.自由:不提供任何狀態視圖,高度可配置,徹底由開發者本身定義。服務器
5.強大:可使用在任何Activity、Fragment、View當中。微信
常量名稱 | 含義 | 使用場景 |
---|---|---|
LOADING | 加載中 | 頁面加載中狀態 |
NETWORK_ERROR | 網絡錯誤 | 當網絡鏈接錯誤時展現的界面 |
LOAD_ERROR | 加載失敗 | 接口請求失敗時展現給用戶的界面 |
EMPTY | 空佈局 | 當獲取的數據爲空時展現的界面 |
NOT_FOUND | 未找到內容佈局 | 有時獲取的內容已被服務器刪除,此時展現給用戶一個404內容被刪除的界面 |
CONTENT | 內容 | 真正須要展現給用戶的內容視圖,也是開發者在layout裏實際佈局的視圖 |
WIDGET_NETWORK_ERROR | 網絡錯誤小部件 | 一個相似於QQ、微信斷網時頂部顯示的網絡錯誤提示視圖 |
WIDGET_ELFIN | 小精靈(提示佈局) | 一種頂部出現的提示佈局,能夠作相似於簡書刷新時提醒推薦內容條數的小部件 |
WIDGET_FLOAT | 底部Float | 一種底部彈出的浮動佈局,能夠實現底部彈出小組件的功能 |
在這裏咱們將前6種狀態稱之爲普通狀態視圖,後面3種統稱爲Widget小部件。下文再也不贅述!網絡
其中,普通狀態視圖不會同時顯示,Widget小部件狀態的顯示和前6種狀態不衝突(能夠同時顯示),架構
視圖層次上Widget在普通狀態視圖之上,WIDGET_ELFIN在WIDGET_NETWORK_ERROR之下。
step one:
allprojects { repositories { maven { url 'https://www.jitpack.io' } } }
step two :
dependencies { implementation 'com.github.FengChenSunshine:UiStatus:{version}' }
UiStatus庫不提供任何狀態的視圖,徹底由開發者本身自定義提供。
UiStatusManager.getInstance()
/** * @params uiStatus 視圖狀態. * @params layoutResId 開發者自定義的該狀態視圖. */ addUiStatusConfig(@UiStatus int uiStatus, @LayoutRes int layoutResId); /** * @params uiStatus 視圖狀態. * @params layoutResId 開發者自定義的該狀態視圖. * @params retryTriggerViewId 該狀態視圖上點擊事件的觸發控件id. * @params retryListener 點擊事件觸發後的回調. */ addUiStatusConfig(@UiStatus int uiStatus, @LayoutRes int layoutResId, @IdRes int retryTriggerViewId, OnRetryListener retryListener); /** * 該方法只針對Widget相關狀態有效. * @params uiStatus 視圖狀態. * @params topMarginPx widget相對於內容視圖的頂部距離,好比可能須要預留出頂部Toolbar高度的距離. * @params bottomMarginPx widget相對於內容視圖的底部距離,好比可能須要預留出底部導航欄高度的距離. */ setWidgetMargin(@UiStatus @IntRange(from = 7L,to = 9L) int uiStatus, int topMarginPx, int bottomMarginPx);
考慮到開發者項目中都有本身的網絡狀態監聽、判斷的工具類, 因此UiStatus沒有必要額外編輯這段功能代碼,僅須要開發者配置一個回調便可。 配置網絡狀態提供者後,在請求顯示普通的狀態時若是是沒有網絡那麼將自動重定向到NETWORK_ERROR網絡錯誤狀態界面。 具體配置方法以下: UiStatusNetworkStatusProvider .getInstance() .registerOnRequestNetworkStatusEvent(OnRequestNetworkStatusEvent networkStatusEvent);
UiStatus可使用在任何Activity、View以及Fragment中.
UiStatusController.get().bind(activity);
UiStatusController.get().bind(view);
因爲Fragment的特殊性,因此這裏稍微麻煩一點點: public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { View view; //你的視圖初始化... mUiStatusController = UiStatusController.get(); return mUiStatusController.bindFragment(view); } 看以看出這裏是使用bindFragment(view)方法將本來的內容視圖傳遞給UiStatus,並將該方法返回的控件做爲onCreateView的返回值便可。
對於普通視圖切換使用UiStatusController.changeUiStatusIgnore(uiStatus)切換; 對於Widget視圖使用UiStatusController.showWidget(uiStatus)進行顯示; 或者使用其重載方法showWidget(uiStatus,duration)方法進行顯示,使用該方法時會在duration時間後自動隱藏; 也可使用UiStatusController.hideWidget()方法進行隱藏Widget小部件。
通過上面的步驟以後您已經成功的集成而且可使用UiStatus庫了,而且您確定也看到了想要看到的各類狀態下的視圖成功切換。
若是您不須要某些頁面的個性化定製,那麼到這裏就OK了;不然請看下面的步驟會知足你的需求。
通常狀況下使用在Application中的全局配置已經能知足大部分頁面視圖狀態的需求,
若是某些個別界面須要特殊配置那麼UiStatus也是支持的。
只須要使用持有的UiStatusController對象,調用其addUiStatusConfig()或其餘任何能夠在全局配置中使用的方法從新配置便可。
通常的開發者只須要在自定義的Application中全局配置一次便可,而且對於LOADING、LOAD_ERROR、EMPTY、NOT_FOUND、CONTENT這些普通視圖的切換能夠下沉到 統一在基類Activity、Fragment或者網絡加載框架中處理,具體使用大同小異,可參考Demo,這裏再也不贅述。
注:圖片來自其餘APP,僅供參考實現效果使用。其餘未列出效果不表明不能實現,具體可實現效果盡情發揮想象!!!
想學習更多Android知識,請加入Android技術開發企鵝交流 7520 16839
進羣與大牛們一塊兒討論,還可獲取Android高級架構資料、源碼、筆記、視頻
包括 高級UI、Gradle、RxJava、小程序、Hybrid、移動架構、React Native、性能優化等全面的Android高級實踐技術講解性能優化架構思惟導圖,和BATJ面試題及答案!
羣裏免費分享給有須要的朋友,但願可以幫助一些在這個行業發展迷茫的,或者想系統深刻提高以及困於瓶頸的朋友,在網上博客論壇等地方少花些時間找資料,把有限的時間,真正花在學習上,因此我在這免費分享一些架構資料及給你們。但願在這些資料中都有你須要的內容。