zoukankan      html  css  js  c++  java
  • 直接拿去用!每个App都会用到的LoadingLayout

    前言

    项目里都会遇到几种页面,分别为加载中、无网络、无数据、出错四种情况,经常要使用,所以封成库引用了,方便使用,顺便分享出来。先看一下效果:

     

    原理比较简单,继承FrameLayout,在xml渲染完成后,加上加载中、无网络、无数据、出错四个页面,根据需要控制显示哪一层,花了些时间,开了很多方法出来,支持很多属性的设置,算是比较实用,源码里已对各个方法的作用都加了注释,就不做过多解释了,项目GitHub地址:https://github.com/weavey/LoadingLayoutDemo,感兴趣的可以看看,欢迎指出问题。

     

    使用方式

    gradle引用:

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

    使用说明

    LoadingLayout支持全局配置,对所有使用到的地方都起效,需要在Application中配置,如下:

     1  public class App extends Application {
     2 
     3     @Override
     4     public void onCreate() {
     5         super.onCreate();
     6 
     7         LoadingLayout.getConfig()
     8                 .setErrorText("出错啦~请稍后重试!")
     9                 .setEmptyText("抱歉,暂无数据")
    10                 .setNoNetworkText("无网络连接,请检查您的网络···")
    11                 .setErrorImage(R.mipmap.define_error)
    12                 .setEmptyImage(R.mipmap.define_empty)
    13                 .setNoNetworkImage(R.mipmap.define_nonetwork)
    14                 .setAllTipTextColor(R.color.gray)
    15                 .setAllTipTextSize(14)
    16                 .setReloadButtonText("点我重试哦")
    17                 .setReloadButtonTextSize(14)
    18                 .setReloadButtonTextColor(R.color.gray)
    19                 .setReloadButtonWidthAndHeight(150,40);
    20     }
    21 }

     由于“加载中”的页面,可能每个App都不一样,因此,LoadingLayout支持自定义LoadingPage,如下:

    1  LoadingLayout.getConfig()
    2      .setLoadingPageLayout(R.layout.define_loading_page);

    同时,为了适应个别界面的“特殊需求”,LoadingLayout也支持局部设置各种属性,仅对当前对象生效,不影响全局。如下:

    1         LoadingLayout  loading = (LoadingLayout) findViewById(R.id.loading_layout);
    2         loading.setLoadingPage(R.layout.define_loading_page)
    3                 .setEmptyText("暂无报告数据")
    4                 .setErrorText("")
    5                 .setNoNetworkText("")
    6                 .setErrorImage(R.mipmap.ic_launcher)
    7                 .setErrorTextSize(16)
    8                 .setReloadButtonText("点我重新加载哦"); //等等

    为ReloadButton设置监听:

    1 loadingLayout.setOnReloadListener(new LoadingLayout.OnReloadListener() {
    2             @Override
    3             public void onReload(View v) {
    4 
    5             }
    6         });

    设置显示的页面:

    1  loadingLayout.setStatus(LoadingLayout.Loading);//加载中
    2  loadingLayout.setStatus(LoadingLayout.Empty);//无数据
    3  loadingLayout.setStatus(LoadingLayout.Error);//错误
    4  loadingLayout.setStatus(LoadingLayout.No_Network);//无网络
    5  loadingLayout.setStatus(LoadingLayout.Success);//加载成功

    最后,在xml里面使用:

     1 <com.weavey.loading.lib.LoadingLayout
     2     xmlns:android="http://schemas.android.com/apk/res/android"
     3     xmlns:app="http://schemas.android.com/apk/res-auto"
     4     android:layout_width="match_parent"
     5     android:layout_height="match_parent"
     6     android:paddingBottom="@dimen/activity_vertical_margin"
     7     android:paddingLeft="@dimen/activity_horizontal_margin"
     8     android:paddingRight="@dimen/activity_horizontal_margin"
     9     android:paddingTop="@dimen/activity_vertical_margin"
    10     app:isFirstVisible="true">
    11 
    12     <TextView
    13         android:background="@color/colorPrimary"
    14         android:visibility="visible"
    15         android:gravity="center"
    16         android:textColor="@android:color/white"
    17         android:layout_width="match_parent"
    18         android:layout_height="match_parent"
    19         android:text="ContentView"/>
    20 
    21 </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,预览布局。

  • 相关阅读:
    响应式布局,流式布局与固定布局
    垃圾回收机制
    形象讲解时间复杂度
    数据结构和算法简介
    数据结构之栈和队列
    十、str的索引、切片和str常用的操作方法(重点)
    九、基础数类型总览和str、int、bool之间的相互转化
    八、编码的初识和进阶
    七、格式化输出和运算符
    六、while循环
  • 原文地址:https://www.cnblogs.com/huolongluo/p/6489276.html
Copyright © 2011-2022 走看看