UiStatus一個簡單且強大的AndroidUi視圖狀態控制庫.

UiStatus 一個簡單且強大的Android Ui視圖狀態控制庫.

我一直以爲程序員就像詩人同樣,敲代碼就像寫詩,好的代碼未嘗不是一首優美的詩!git

因此我把項目中的視圖控制部分抽取出來,單獨封裝成了UiStatus這個庫。但願能夠幫助你們簡化這部分操做,也但願對你們有用。程序員

部分效果演示github

優勢:

1.輕量:簡單且夠用!!!面試

2.省內存:使用ViewStub,全部未使用到的狀態均不會初始化,減小視圖初始化開銷。小程序

3.解耦、封裝:下降各類視圖狀態和業務層耦合,使用者只須要關心業務層邏輯而無需知道視圖狀態管理內部邏輯。性能優化

4.自由:不提供任何狀態視圖,高度可配置,徹底由開發者本身定義。服務器

5.強大:可使用在任何Activity、Fragment、View當中。微信

目前該庫包含的狀態有9種:

常量名稱 含義 使用場景
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之下。

使用步驟

1.添加依賴

step one:

allprojects {

    repositories {

        maven { url 'https://www.jitpack.io' }

}

}

step two :

dependencies {

        implementation 'com.github.FengChenSunshine:UiStatus:{version}'

}

2.全局配置

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);

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)方法將本來的內容視圖傳遞給UiStatus,並將該方法返回的控件做爲onCreateView的返回值便可。

④.視圖狀態切換:

對於普通視圖切換使用UiStatusController.changeUiStatusIgnore(uiStatus)切換;

對於Widget視圖使用UiStatusController.showWidget(uiStatus)進行顯示;

或者使用其重載方法showWidget(uiStatus,duration)方法進行顯示,使用該方法時會在duration時間後自動隱藏;

也可使用UiStatusController.hideWidget()方法進行隱藏Widget小部件。

4.成功

通過上面的步驟以後您已經成功的集成而且可使用UiStatus庫了,而且您確定也看到了想要看到的各類狀態下的視圖成功切換。

若是您不須要某些頁面的個性化定製,那麼到這裏就OK了;不然請看下面的步驟會知足你的需求。

5.個性化配置

通常狀況下使用在Application中的全局配置已經能知足大部分頁面視圖狀態的需求,

若是某些個別界面須要特殊配置那麼UiStatus也是支持的。

只須要使用持有的UiStatusController對象,調用其addUiStatusConfig()或其餘任何能夠在全局配置中使用的方法從新配置便可。

6.優化

通常的開發者只須要在自定義的Application中全局配置一次便可,而且對於LOADING、LOAD_ERROR、EMPTY、NOT_FOUND、CONTENT這些普通視圖的切換能夠下沉到 統一在基類Activity、Fragment或者網絡加載框架中處理,具體使用大同小異,可參考Demo,這裏再也不贅述。

7.UiStatus可實現效果部分展現

注:圖片來自其餘APP,僅供參考實現效果使用。其餘未列出效果不表明不能實現,具體可實現效果盡情發揮想象!!!

最後給你們分享一份很是系統和全面的Android進階技術大綱及進階資料,及面試題集

想學習更多Android知識,請加入Android技術開發企鵝交流 7520 16839

進羣與大牛們一塊兒討論,還可獲取Android高級架構資料、源碼、筆記、視頻

包括 高級UI、Gradle、RxJava、小程序、Hybrid、移動架構、React Native、性能優化等全面的Android高級實踐技術講解性能優化架構思惟導圖,和BATJ面試題及答案!

羣裏免費分享給有須要的朋友,但願可以幫助一些在這個行業發展迷茫的,或者想系統深刻提高以及困於瓶頸的朋友,在網上博客論壇等地方少花些時間找資料,把有限的時間,真正花在學習上,因此我在這免費分享一些架構資料及給你們。但願在這些資料中都有你須要的內容。

相關文章
相關標籤/搜索