1. 程式人生 > >網路請求載入控制元件的簡單實現,能顯示載入中、沒網路、載入失敗點選重新載入等狀態

網路請求載入控制元件的簡單實現,能顯示載入中、沒網路、載入失敗點選重新載入等狀態

網路請求經常需要用到載入的一個動畫,有這麼幾種狀態:

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

果然用起來清爽多了!

相關推薦

網路請求載入控制元件簡單實現顯示載入網路載入失敗重新載入狀態

網路請求經常需要用到載入的一個動畫,有這麼幾種狀態: 1、正在載入中,顯示一個動畫。 2、載入成功,則動畫消失。 3、沒網路,則點選能直接開啟設定進行網路設定。 4、載入失敗,則點選能重新載入。 載入控制元件效果如下: 因為使用頻率很高,所以寫了一個控制元件,把這麼些基本

不用splitter控制元件 簡單實現對mfc對話方塊的分割的方法

不用splitter控制元件  簡單實現對mfc對話方塊的分割的方法 直接貼上原始碼主要部分吧 這個是基於對話方塊的工程 進行對話方塊的分割實現 只是相應了三個訊息函式,看一下就會明白的 我空間資源裡邊有現成的工程程式碼可以下載執行 .cpp 檔案 // spliteDl

Android拖動控制元件實現自定義可拖動的LinearLayout

工作內容; 1.拖動控制元件 2.自定義可拖動的LinearLayout 學習分享: 一、拖動控制元件的實現步驟: 【前提:控制元件在RelativeLayout中,或者在GridLayout中】 1.按下圖搞懂幾個座標 檢視寬度 view.getWidth(); 檢視高

Winform非同步等待控制元件簡單實現

思路 BaseForm類繼承Form class:通過拓展BaseForm類新增控制元件,使用時繼承BaseForm 等待控制元件作用: 禁用主窗體控制元件; 顯示進度條控制元件 非同步呼叫: try{} finally{}進行控制元件的回收 實

android 動態設定控制元件的高度使用對應佈局的dp值

1. 獲取你要進行改變的控制元件的佈局 LinearLayout.LayoutParams linearParams =(LinearLayout.LayoutParams) myView.getLayoutParams(); 2.設定佈局的高度   後面的引數就是對應

Qt 實現控制元件中點滑鼠就在滑鼠載入圖片的方法

首先應該知道,QLabel類是沒有點選事件的。我們需要點選滑鼠,那麼必須重寫一個QLabel類去繼承原來的QLabel。比如說我定義PutPicLabel來繼承QLabel。 在標頭檔案中應該這麼寫: #ifndef PUTPICLABEL_H #define PUTPI

duilib中將xml封裝為控制元件簡單示例(簡單自定義控制元件封裝幾個基本控制元件合為1個自定義控制元件)

使用duilib的時候,難免會有這樣的需求: 某一塊Container(Layout)以及裡面的佈局需要重複用,不想每次都複製貼上這麼多,要不然xml太大了; 通過繼承來自定義一個控制元件,比如CButtonUIEx之類的,想讓他像button一樣在xml中被識別; xml裡面的東西

iOS 開發 WKWebView載入網頁對網頁控制元件進行更改使用OC新增JS

//獲取載入的網頁 - (void)webView:(WKWebView *)webView decidePolicyForNavigationResponse:(WKNavigationResponse *)navigationResponse decisionHandler:(void

一個簡單好用的下拉重新整理上拉載入控制元件

*本篇文章已授權微信公眾號 guolin_blog (郭霖)獨家釋出 有更新: 最新的庫版本為1.0.2(相容舊版本,舊版本是1.0.0),完整的庫地址: compile'com.zt.maven.widget:refreshview:1.0.2

Android橫向滑動載入更多的控制元件實現---HorizontalScrollSlideView

Android橫向滑動載入更多的控制元件的實現—HorizontalScrollSlideView 需求 之前公司業務要求做一個橫向滑動的,可以載入更多的控制元件,第一時間想到的就是 RecyclerView 來實現 ,後面仔細想想滑動攔截不好控制等等

VB.NET實現動態載入控制元件陣列

vb.net中沒有控制元件陣列,它也不主張用控制元件陣列,因為它對記憶體的開銷非常大。控制元件陣列問題在.NET中完全有其它方法代替。如果一定要用     for   i   as   integer   to   20

自定義view動態載入控制元件實現動態換行

自定義view動態載入控制元件 先來講下需求吧,可能我們開發中會遇到這樣的場景,需要在一個父容器里加載多個子view,但是,子view的排版又有特殊要求,比如自適應螢幕寬度或者高度等,這樣以來原本的控制元件無法滿足需要了。先看下圖的實現效果,介面有些粗糙,

Android自定義控制元件實戰——實現仿IOS下拉重新整理上拉載入 PullToRefreshLayout

         下拉重新整理控制元件,網上有很多版本,有自定義Layout佈局的,也有封裝控制元件的,各種實現方式的都有。但是很少有人告訴你具體如何實現的,今天我們就來一步步實現自己封裝的 PullToRefreshLayout 完美的解決下拉重新整理,上拉載入問題。  

JS利用ActiveX控制元件的方式即 Excel.Application,實現對word或者excel的列印

實現過程:先將需要列印的資料匯入到word或者excel中,再利用word或者excel的列印功能來實現web列印。    下面以excel為例實現如何列印的過程    將網頁中資料匯入excel中的方法有很多,這裡先介紹一種,利用ActiveX控制元件的方式,即 Exce

RecyclerView實現下拉重新整理與自動載入控制元件封裝

CommonAdapter.java public abstract class CommonAdapter<T> extends RecyclerView.Adapter<ViewHolder> { protected Context mContext; prot

okhttp讓你的網路請求變得更加簡單

我們後端在工作中,可能接觸最多的無非是介面請求了,之前用的最多的是httpclient,後來通過一系列的對比可以發現,okhttp比httpclient更加優秀。因此,寫了OkHttp-FastJson,一個讓網路請求更簡單的框架。 OkHttp-Fast

python3 簡單實現從csv文件讀取內容並對內容進行分類統計

tmp spa writer ict 打開文件 while 類型 spl blog 新手python剛剛上路,在實際工作中遇到如題所示的問題,嘗試使用python3簡單實現如下,歡迎高手前來優化import csv #打開文件,用with打開可以不用去特意關閉file了

CCombobox控制元件修改編輯框游標顯示位置呈現:上下垂直狀態

使用MFC中系統CCombobox控制元件中CBN_DROPDWON風格時,edit編輯控制元件的高度的游標一直處於左上角位置。 效果如下圖所示: 其實,想要實現游標處於垂直狀態,如下圖所示: 這種效果看著就比較順眼了。 在此,有人想要問,怎麼改變編輯框的高度呢?

重繪ListCtrl增加子控制元件Edit是在父控制元件失去焦點時控制元件不進行隱藏

問題:現在有一個listctrl控制元件,需要在某一列上新增一個子控制元件edit。當點選子控制元件(edit)時,子控制元件顯示出來,父控制元件(ListCtrl)已經失去焦點了。此時,要是滑鼠點選的位置不在該控制元件內,edit處於顯示狀態,父控制元件(ListCtrl)是失去焦點狀態。

VS2010-MFC:單文件左側可停靠對話方塊(包含樹控制元件)的實現

在程式開發中我們經常看見有一些軟體左側有目錄樹或者是圖層樹,點選之後就可以右側View視窗顯示相關的內容,其實實現這種機制有兩種方法,第一種就是對MFC的View視窗進行視窗分割,左側的視窗view類派生於CTreeView,其中CTreeView自帶一個變數用於View中的樹控制元件的控制。第二