直接拿去用懊缺!每個(gè)App都會(huì)用到的LoadingLayout
項(xiàng)目里都會(huì)遇到幾種頁面疫稿,分別為加載中、無網(wǎng)絡(luò)桐汤、無數(shù)據(jù)而克、出錯(cuò)四種情況,經(jīng)常要使用怔毛,所以封成庫引用了员萍,方便使用,順便分享出來拣度。先看一下效果:341fb9f9a8edfbe56649.gif
原理比較簡單碎绎,繼承FrameLayout螃壤,在xml渲染完成后,加上加載中筋帖、無網(wǎng)絡(luò)奸晴、無數(shù)據(jù)、出錯(cuò)四個(gè)頁面日麸,根據(jù)需要控制顯示哪一層寄啼,花了些時(shí)間,開了很多方法出來代箭,支持很多屬性的設(shè)置墩划,算是比較實(shí)用,源碼里已對(duì)各個(gè)方法的作用都加了注釋嗡综,就不做過多解釋了
項(xiàng)目GitHub地址:https://github.com/weavey/LoadingLayoutDemo乙帮,
gradle引用:
compile 'com.lai.weavey:loadinglayout:1.3.1'
使用說明
LoadingLayout支持全局配置,對(duì)所有使用到的地方都起效极景,需要在Application中配置察净,如下:
public class App extends Application {
@Override
public void onCreate() {
super.onCreate();
LoadingLayout.getConfig()
.setErrorText("出錯(cuò)啦~請(qǐng)稍后重試!")
.setEmptyText("抱歉盼樟,暫無數(shù)據(jù)")
.setNoNetworkText("無網(wǎng)絡(luò)連接氢卡,請(qǐng)檢查您的網(wǎng)絡(luò)···")
.setErrorImage(R.mipmap.define_error)
.setEmptyImage(R.mipmap.define_empty)
.setNoNetworkImage(R.mipmap.define_nonetwork)
.setAllTipTextColor(R.color.gray)
.setAllTipTextSize(14)
.setReloadButtonText("點(diǎn)我重試哦")
.setReloadButtonTextSize(14)
.setReloadButtonTextColor(R.color.gray)
.setReloadButtonWidthAndHeight(150,40);
}
由于“加載中”的頁面,可能每個(gè)App都不一樣恤批,因此异吻,LoadingLayout支持自定義LoadingPage,如下:
LoadingLayout.getConfig()
.setLoadingPageLayout(R.layout.define_loading_page);
同時(shí)喜庞,為了適應(yīng)個(gè)別界面的“特殊需求”,LoadingLayout也支持局部設(shè)置各種屬性棋返,僅對(duì)當(dāng)前對(duì)象生效延都,不影響全局。如下:
LoadingLayout loading = (LoadingLayout) findViewById(R.id.loading_layout);
loading.setLoadingPage(R.layout.define_loading_page)
.setEmptyText("暫無報(bào)告數(shù)據(jù)")
.setErrorText("")
.setNoNetworkText("")
.setErrorImage(R.mipmap.ic_launcher)
.setErrorTextSize(16)
.setReloadButtonText("點(diǎn)我重新加載哦"); //等等
為ReloadButton設(shè)置監(jiān)聽:
loadingLayout.setOnReloadListener(new LoadingLayout.OnReloadListener() {
@Override
public void onReload(View v) {
}
});
設(shè)置顯示的頁面:
loadingLayout.setStatus(LoadingLayout.Loading);//加載中
loadingLayout.setStatus(LoadingLayout.Empty);//無數(shù)據(jù)
loadingLayout.setStatus(LoadingLayout.Error);//錯(cuò)誤
loadingLayout.setStatus(LoadingLayout.No_Network);//無網(wǎng)絡(luò)
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渲染完成后調(diào)用:loadingLayout.setStatus(LoadingLayout.Loading);會(huì)造成界面閃爍的效果,影響體驗(yàn)验夯,因此默認(rèn)將contentView隱藏猖吴,所以數(shù)據(jù)加載完成后一定要調(diào)用loadingLayout.setStatus(LoadingLayout.Success);,將contentView顯示出來挥转。這樣也能解決未獲取到數(shù)據(jù)的情況下海蔽,被用戶看到雜亂無章的布局共屈,個(gè)人還是比較喜歡默認(rèn)隱藏contentView;
(2)為了方便管理党窜,LoadingLayout只能有一個(gè)直屬子View拗引,類似ScrollView,添加兩個(gè)直屬子View會(huì)拋出異常throw new IllegalStateException("LoadingLayout can host only one direct child");
(3)由于AS會(huì)直接將自定義View的特性反應(yīng)在預(yù)覽界面幌衣,所以在使用LoadingLayout的時(shí)候矾削,會(huì)無法看到被LoadingLayout包裹住的布局(默認(rèn)為gone),因此也可以將isFirstVisible屬性暫時(shí)設(shè)為true豁护,預(yù)覽布局怔软。