直接拿去用!每一個App都會用到的LoadingLayout

前言

項目裏都會遇到幾種頁面,分別爲加載中、無網絡、無數據、出錯四種狀況,常常要使用,因此封成庫引用了,方便使用,順便分享出來。先看一下效果:javascript


原理比較簡單,繼承FrameLayout,在xml渲染完成後,加上加載中、無網絡、無數據、出錯四個頁面,根據須要控制顯示哪一層,花了些時間,開了不少方法出來,支持不少屬性的設置,算是比較實用,源碼裏已對各個方法的做用都加了註釋,就不作過多解釋了,項目GitHub地址: github.com/weavey/Load…,感興趣的能夠看看,歡迎指出問題。

使用方式

gradle引用:java

compile 'com.lai.weavey:loadinglayout:1.3.1'android

使用說明

LoadingLayout支持全局配置,對全部使用到的地方都起效,須要在Application中配置,以下:git

public class App extends Application {

    @Override
    public void onCreate() {
        super.onCreate();

        LoadingLayout.getConfig()
                .setErrorText("出錯啦~請稍後重試!")
                .setEmptyText("抱歉,暫無數據")
                .setNoNetworkText("無網絡鏈接,請檢查您的網絡···")
                .setErrorImage(R.mipmap.define_error)
                .setEmptyImage(R.mipmap.define_empty)
                .setNoNetworkImage(R.mipmap.define_nonetwork)
                .setAllTipTextColor(R.color.gray)
                .setAllTipTextSize(14)
                .setReloadButtonText("點我重試哦")
                .setReloadButtonTextSize(14)
                .setReloadButtonTextColor(R.color.gray)
                .setReloadButtonWidthAndHeight(150,40);
    }
}複製代碼

因爲「加載中」的頁面,可能每一個App都不同,所以,LoadingLayout支持自定義LoadingPage,以下:github

LoadingLayout.getConfig()
     .setLoadingPageLayout(R.layout.define_loading_page);複製代碼

同時,爲了適應個別界面的「特殊需求」,LoadingLayout也支持局部設置各類屬性,僅對當前對象生效,不影響全局。以下:微信

LoadingLayout  loading = (LoadingLayout) findViewById(R.id.loading_layout);
        loading.setLoadingPage(R.layout.define_loading_page)
                .setEmptyText("暫無報告數據")
                .setErrorText("")
                .setNoNetworkText("")
                .setErrorImage(R.mipmap.ic_launcher)
                .setErrorTextSize(16)
                .setReloadButtonText("點我從新加載哦"); //等等複製代碼

爲ReloadButton設置監聽:網絡

loadingLayout.setOnReloadListener(new LoadingLayout.OnReloadListener() {
            @Override
            public void onReload(View v) {

            }
        });複製代碼

設置顯示的頁面:app

loadingLayout.setStatus(LoadingLayout.Loading);//加載中
 loadingLayout.setStatus(LoadingLayout.Empty);//無數據
 loadingLayout.setStatus(LoadingLayout.Error);//錯誤
 loadingLayout.setStatus(LoadingLayout.No_Network);//無網絡
 loadingLayout.setStatus(LoadingLayout.Success);//加載成功複製代碼

最後,在xml裏面使用:框架

<com.weavey.loading.lib.LoadingLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    app:isFirstVisible="true">

    <TextView android:background="@color/colorPrimary" android:visibility="visible" android:gravity="center" android:textColor="@android:color/white" android:layout_width="match_parent" android:layout_height="match_parent" android:text="ContentView"/> </com.weavey.loading.lib.LoadingLayout>複製代碼

注意:
(1)isFirstVisible屬性用來控制contentView一開始是否隱藏,因爲LoadingLayout原理是在xml渲染完成後在contentView上鋪上三層View,所以,一開始若是不隱藏,等contentView渲染完成後調用: loadingLayout.setStatus(LoadingLayout.Loading);
會形成界面閃爍的效果,影響體驗,所以默認將contentView隱藏,因此數據加載完成後必定要調用loadingLayout.setStatus(LoadingLayout.Success);,將contentView顯示出來。這樣也能解決未獲取到數據的狀況下,被用戶看到雜亂無章的佈局,我的仍是比較喜歡默認隱藏contentView;
(2)爲了方便管理,LoadingLayout只能有一個直屬子View,相似ScrollView,添加兩個直屬子View會拋出異常throw new IllegalStateException("LoadingLayout can host only one direct child");
(3)因爲AS會直接將自定義View的特性反應在預覽界面,因此在使用LoadingLayout的時候,會沒法看到被LoadingLayout包裹住的佈局(默認爲gone),所以也能夠將isFirstVisible屬性暫時設爲true,預覽佈局。ide


更多精彩文章請關注微信公衆號"Android經驗分享":這裏將長期爲您分享Android高手經驗、中外開源項目、源碼解析、框架設計和Android好文推薦!QQ交流羣:Android經驗分享一區 386067289

微信公衆號
相關文章
相關標籤/搜索