网络请求加载控件的简单实现,能显示加载中、没网络、加载失败点击重新加载等状态
2017-12-07 15:04
846 查看
网络请求经常需要用到加载的一个动画,有这么几种状态:
1、正在加载中,显示一个动画。
2、加载成功,则动画消失。
3、没网络,则点击能直接打开设置进行网络设置。
4、加载失败,则点击能重新加载。
加载控件效果如下:
![](http://img.blog.csdn.net/20171207143355126?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbGluX2RpYW53ZWk=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
因为使用频率很高,所以写了一个控件,把这么些基本的操作给融合进去,需要用到的地方,只需要添加这个控件,并设置相应的状态就可以了,其他的事情希望控件本身能自己完成。以下为实现过程:
一、加载控件布局layout下,load_status.xml:
drawable下,loading_anim.xml:
二、加载控件实现,原理看代码体会,LoadStatusView.java:
三、Activity中的使用很简单:
在需要用到的布局添加该控件:
果然用起来清爽多了!
1、正在加载中,显示一个动画。
2、加载成功,则动画消失。
3、没网络,则点击能直接打开设置进行网络设置。
4、加载失败,则点击能重新加载。
加载控件效果如下:
因为使用频率很高,所以写了一个控件,把这么些基本的操作给融合进去,需要用到的地方,只需要添加这个控件,并设置相应的状态就可以了,其他的事情希望控件本身能自己完成。以下为实现过程:
一、加载控件布局layout下,load_status.xml:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:background="#00ffffff" android:padding="0dp" android:gravity="center" android:orientation="horizontal"> <ImageView android:id="@+id/iv_load_anim" android:layout_width="wrap_content" android:layout_height="wrap_content" android:background="@drawable/loading_anim"/> <TextView android:id="@+id/tv_load_text" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="12sp" android:paddingStart="5dp" android:paddingEnd="5dp" android:textColor="@drawable/load_status_text_selector" android:maxLines="1" android:ellipsize="end" android:text="@string/load_status_loading"/> </LinearLayout>其中涉及到的几个资源如下:
drawable下,loading_anim.xml:
<?xml version="1.0" encoding="utf-8"?> <animation-list xmlns:android="http://schemas.android.com/apk/res/android" android:oneshot="false" > <item android:drawable="@drawable/loading_anim_00" android:duration="85"/> <item android:drawable="@drawable/loading_anim_01" android:duration="85"/> <item android:drawable="@drawable/loading_anim_02" android:duration="85"/> <item android:drawable="@drawable/loading_anim_03" android:duration="85"/> <item android:drawable="@drawable/loading_anim_04" android:duration="85"/> <item android:drawable="@drawable/loading_anim_05" android:duration="85"/> </animation-list>drawable下,load_status_text_selector.xml:
<?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:state_enabled="false" android:color="#000000"> </item> <item android:state_pressed="true" android:color="#7f000000"> </item> <item android:color="#000000"> </item> </selector>string.xml中添加:
<string name="load_status_loading">正在加载中</string> <string name="load_status_no_net">没有网络</string> <string name="load_status_fail_refresh">加载失败,点击重新加载</string>
二、加载控件实现,原理看代码体会,LoadStatusView.java:
package com.ldw.widget; import android.content.Context; import android.content.Intent; import android.graphics.drawable.AnimationDrawable; import android.util.AttributeSet; import android.view.View; import android.widget.FrameLayout; import android.widget.ImageView; import android.widget.TextView; import com.ldw.test.R; import com.ldw.utils.NetUtil; /** * LoadStatus布局的操作帮助类 * Created by ldw on 2017/12/7. */ public class LoadStatusView extends FrameLayout implements View.OnClickListener { public static int STATUS_LOADING = 1; public static int STATUS_NO_NET = 2; public static int STATUS_FAIL_REFRESH = 3; public static int STATUS_HIDE = 4; private ImageView ivLoadStatus; private TextView tvLoadStatus; private AnimationDrawable loadAnimationDrawable; public LoadStatusView(Context context) { this(context, null); } public LoadStatusView(Context context, AttributeSet attrs) { this(context, attrs, 0); } public LoadStatusView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); init(); } private void init(){ View.inflate(getContext(), R.layout.load_status, this); setClickable(true);//这个是为了不让点击穿透到下层界面去,以免下层的控件看不见却莫名其妙的响应了 ivLoadStatus = findViewById(R.id.iv_load_anim); tvLoadStatus = findViewById(R.id.tv_load_text); loadAnimationDrawable = (AnimationDrawable) ivLoadStatus.getBackground(); tvLoadStatus.setOnClickListener(this); } public void setLoading(){ setVisibility(View.VISIBLE); ivLoadStatus.setVisibility(VISIBLE); tvLoadStatus.setVisibility(VISIBLE); loadAnimationDrawable.start(); tvLoadStatus.setText(getResources().getString(R.string.load_status_loading)); tvLoadStatus.setClickable(false); tvLoadStatus.setEnabled(false); } public void setNoNet(){ setVisibility(View.VISIBLE); ivLoadStatus.setVisibility(GONE); tvLoadStatus.setVisibility(VISIBLE); tvLoadStatus.setText(getResources().getString(R.string.load_status_no_net)); tvLoadStatus.setClickable(true); tvLoadStatus.setEnabled(true); } public void setFailRefresh(){ setVisibility(View.VISIBLE); ivLoadStatus.setVisibility(GONE); tvLoadStatus.setVisibility(VISIBLE); tvLoadStatus.setText(getResources().getString(R.string.load_status_fail_refresh)); tvLoadStatus.setClickable(true); tvLoadStatus.setEnabled(true); } public void setHide(){ setVisibility(View.GONE); tvLoadStatus.setClickable(false); tvLoadStatus.setEnabled(false); } @Override public void onClick(View v) { if(v == tvLoadStatus){ if(NetUtil.getNetworkState(getContext()) == NetUtil.NETWORK_NONE){ openSettings(); }else{ if(onRefreshListener != null){ onRefreshListener.onRefreshListener(); } } } } /** * 设置点击刷新监听 * @param listener listener */ public void setOnRefreshListener(OnRefreshListener listener) { onRefreshListener = listener; } /** * 打开设置 */ private void openSettings(){ Intent intent = new Intent(); intent.setAction(android.provider.Settings.ACTION_SETTINGS); getContext().startActivity(intent); } OnRefreshListener onRefreshListener = null; public interface OnRefreshListener{ void onRefreshListener(); } }这里除了给出几个设置状态的接口外,还在适当的时候自动打开设置进行网络设置,文本可以点击时才有点击效果,还增加了重新加载的接口。里面涉及到另一个网络判断的工具类,也非常简单,在另一篇博文有 http://blog.csdn.net/lin_dianwei/article/details/78741293
三、Activity中的使用很简单:
在需要用到的布局添加该控件:
<com.ldw.widget.LoadStatusView android:id="@+id/lsv_load_status" android:layout_width="match_parent" android:layout_height="match_parent" android:visibility="gone" android:background="@color/colorBackground"> </com.ldw.widget.LoadStatusView>Activity中使用:
mLoadStatusView = (LoadStatusView) findViewById(R.id.lsv_load_status); mLoadStatusView.setOnRefreshListener(new LoadStatusView.OnRefreshListener() { @Override public void onRefreshListener() { //重新加载操作在这里 } }); //设置加载控件状态 mLoadStatusView.setLoading();
果然用起来清爽多了!
相关文章推荐
- ExpandableListView 实现点击某个group的时候再去请求网络动态加载子视图中的数据
- 点击侧滑任何一个 菜单项,请求网络数据展示在主界面的xlistview中且实现下拉刷新效果和上拉加载的分页加载数据效果
- MVP实现用Retrofit请求网络数据Fresco加载图片,Recyclerview CheckBox显示并实现全选删除
- 安卓开发中实现替换webview加载网页失败时的页面和失败后点击后重新加载
- IE9的F12工具,"网络"页签,点击"开始捕获"之后,请求显示的状态是"挂起"的分析和解决
- Android通过请求网络数据实现ListView,ListView的优化、图片的缓存、子控件的点击事件。
- 关于加载无网络图与无数据图设计思路,点击重新加载方法实现
- IE9的F12工具,"网络"页签,点击"开始捕获"之后,请求显示的状态是"挂起"的分析和解决
- PullToRefreshListView上拉加载,下拉刷新 刷新网络数据 简单实现ListView显示网络数据
- 【转】Winform中DataGridView控件实现拖动行,并在拖动状态中目标行上显示一条红线。
- Ajax请求过程中显示“进度”的简单实现
- iOS之ASIHttp简单的网络请求实现
- 简单的实现listView中item多个控件以及点击事件
- 桌面图标不能点击,鼠标一直显示加载状态
- AE实现右键点击TOC控件任意图层显示属性表
- 简单的实现listView中item多个控件以及点击事件
- Ajax请求过程中显示“进度”的简单实现
- .net 错误:动态加载控件时出现错误:未能加载视图状态。正在向其中加载视图状态的控件树必须与前一请求期间用于保存视图状态的控件树相匹配。
- Iphone实现标题栏网络加载图标的显示和取消
- Repeater控件实现点击列表行单元格.在该行下方显示数据