1. 程式人生 > >Android自定義切換佈局(請求中,無網路,無資料等)

Android自定義切換佈局(請求中,無網路,無資料等)

在一般的專案中,像請求中、無資料、無網路、請求超時等這些狀態的佈局我們需要經常切換。
在之前的專案中,我是在每個需要顯示這些佈局的xml檔案中都include請求中,無資料,無網路等這些佈局,然後再Activity中控制他們的顯示與隱藏,雖然能實現效果,但是控制起來很麻煩,重複的程式碼也很多。如下圖:
1.宣告變數:
宣告變數
2.獲取資源ID
獲取資源ID
3.初始化showView
這裡寫圖片描述
4.控制顯示與隱藏
這裡寫圖片描述
5.showView程式碼
這裡寫圖片描述

可以看到,很麻煩。所以,就有了寫一個專門用來管理這些狀態佈局的類的想法。方便以後的開發。
下面我們來實現它,直接看程式碼,註釋很詳細:
1.shouView類:

package com.yzq.testshowview;

import android.content.Context;
import android.util.AttributeSet;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;

/**
 * Created by yzq on 2016/10/18.
 * 控制佈局的切換
 */
public class ShowView extends LinearLayout implements View.OnClickListener { private View view; private LinearLayout loaddingLayout;//載入中佈局 private LinearLayout abnormalLayout;//異常佈局 (無資料,無網路,請求超時) private ImageView hintImg;//提示圖片 private TextView hintTv;//提示文字 private Button refreshBtn;//重新整理按鈕
public static final int LOADDING = 0;//載入中 public static final int NO_DATA = 1;//無資料 public static final int NO_NET = 2;//無網路 public static final int TIME_OUT = 3;//超時 private RetryListerner retryListener;//重試 public ShowView(Context context) { super(context); initView(context); } public ShowView(Context context, AttributeSet attrs) { super(context, attrs); initView(context); } public ShowView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); initView(context); } private void initView(Context context) { Log.i("初始化view", "initView"); LayoutInflater inflater = (LayoutInflater) context .getSystemService(Context.LAYOUT_INFLATER_SERVICE); view = inflater.inflate(R.layout.show_view_layout, this); loaddingLayout = (LinearLayout) view.findViewById(R.id.loaddingLayout); abnormalLayout = (LinearLayout) view.findViewById(R.id.abnormalLayout); hintImg = (ImageView) view.findViewById(R.id.hintImg); hintTv = (TextView) view.findViewById(R.id.hintTv); refreshBtn = (Button) view.findViewById(R.id.refreshBtn); refreshBtn.setOnClickListener(this); show(LOADDING);//顯示載入中 } @Override public void onClick(View v) { show(LOADDING);//顯示載入中 retryListener.retry();//執行重試邏輯 } /*設定重試監聽*/ public void setOnRetryListener(RetryListerner retryListener) { this.retryListener = retryListener; } public void show(int i) { view.setVisibility(VISIBLE); switch (i) { case LOADDING: /*載入中*/ loaddingLayout.setVisibility(VISIBLE); abnormalLayout.setVisibility(GONE); break; case NO_DATA: /*暫無資料*/ loaddingLayout.setVisibility(GONE); abnormalLayout.setVisibility(VISIBLE); hintImg.setImageResource(R.drawable.no_data); hintTv.setText(R.string.noData); break; case NO_NET: /*無網路*/ loaddingLayout.setVisibility(GONE); abnormalLayout.setVisibility(VISIBLE); hintImg.setImageResource(R.drawable.no_net); hintTv.setText(R.string.noNet); break; case TIME_OUT: /*超時*/ loaddingLayout.setVisibility(GONE); abnormalLayout.setVisibility(VISIBLE); hintImg.setImageResource(R.drawable.no_data); hintTv.setText(R.string.timeOut); break; } } public interface RetryListerner { void retry(); } }

2.在MainActivity中使用:

package com.yzq.testshowview;

import android.os.Bundle;
import android.os.Handler;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;

public class MainActivity extends AppCompatActivity implements ShowView.RetryListerner {


    private ShowView showView;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initView();

        showView.setOnRetryListener(this);//設定監聽


        /*模擬無資料*/
        new Handler().postDelayed(new Runnable() {
            @Override
            public void run() {

                showView.show(ShowView.NO_DATA);
            }
        }, 1000 * 3);


    }

    private void initView() {

        showView = (ShowView) findViewById(R.id.showView);

    }

    @Override
    public void retry() {

        Log.i("重試", "重新整理");
        /*模擬無網路*/
        new Handler().postDelayed(new Runnable() {
            @Override
            public void run() {

                showView.show(ShowView.NO_NET);
            }
        }, 1000 * 3);

    }
}

這樣就方便多了。下面是demo,需要的可以下載看下效果:
demo

相關推薦

Android定義切換佈局請求網路資料

在一般的專案中,像請求中、無資料、無網路、請求超時等這些狀態的佈局我們需要經常切換。 在之前的專案中,我是在每個需要顯示這些佈局的xml檔案中都include請求中,無資料,無網路等這些佈局,然後再Activity中控制他們的顯示與隱藏,雖然能實現效果,但是控

Android簡單的定義抽屜佈局DrawerLayout

採用DrawerLayout的方法實現抽屜佈局的效果,抽屜佈局有兩個部分,第一個部分為主內容區,如圖中的包含底部選單欄的部分。第二部分為側邊欄部分,左邊部分。 對應xml佈局如下:<android.support.v4.widget.DrawerLayout

android--------定義控件

有時 價值 ondraw 自己實現 IE viewgroup 實現 沒有 com 在我們平常的Android開發中經常和控件打交道,有時Android提供的控件未必能滿足業務的需求,這個時候就需要我們實現自定義一些控件 自定義控件可以設計出很多你想要的功能和模塊,在開發中是

Android定義控制元件----繼承ViewGroup側滑選單3普通側滑選單新增選單切換按鈕(完結)

專案結構: 思路: 對外暴露一個選單開啟和關閉選單的方法toggle 當開啟時this.smoothScrollTo(0, 0);滑動選單顯示 當關閉時this.smoothScrollTo(mMenuWidth, 0);選單隱藏

Android定義相機Camera

Time:2018/06/21  因為專案需求,需要實現跟小猿搜題的類似的功能,系統相機直接就被排除了,原本打算是找個一個demo,改吧改吧就直接用了,找的過程中發現程式碼太舊了,目前6.0以上的系統很多不支援,然後按照demo的邏輯,就寫一個相

Android 定義View 常用選單的的Table

0909修改 package com.example.myapplication; import android.content.Context; import android.content.res.TypedArray; import android.graphics.

Android定義View實戰會波動的View

今天寫這篇部落格的目的,主要是幫助自己總結一下今天學習到的自定義View的相關知識,如果順便能夠幫助大家一點點,那我也感覺很開心。 首先,自定義的一般步驟是: 1.建立自定義View,繼承系統自帶的View,並重寫其相關構造方法; 2.在Values下面新

Android定義View初探——仿360垃圾清理

明天就是五一勞動節了,在這裡先祝各位程式猿勞動節快樂,別在加班了! 自從嘗試過寫自定義View(Android自定義View初探(一)——餅圖)之後,每當看到別人的應用時,總是在想別人的實現方式,或許,這就是程式猿的悲哀吧O(∩_∩)O~。 前兩天就想嘗試去

Unity Personal Android定義啟動介面Splash

mUnityPlayer = new UnityPlayer(this); ivSplash=new ImageView(this); ivBg=new ImageView(this); ivBg.setBackgroundColor(

Android定義View總結基礎知識與例項

自定義View是最能體現一個Android開發者水平的技能之一了。 接下來的一些列部落格將總結一下Android的自定義相關View知識,包括View的結構,事件體系,工作原理,自定義View的繪製等。 參考資料部分來自於書上以及各種部落格。 新建了一個qq群 482

Android定義圖表庫:圓形進度圖

效果預覽 自定義View第一步:確認View的大小 無論是自定義一個View還是ViewGroup我們必須得先為其制定在不同MeasureSpecMode下的大小,我這裡就不講解什麼繪製原始碼了什麼的,我們就直接實戰。 我們在onMeasure中需要呼叫se

Android---定義ViewPager指示器

最近學習了怎麼自己畫Viewpager指示器的形狀。 新建立一個ViewPagerIndicator類 繼承自LinearLayout 初始化Paint例項 在它的含有兩個引數的構造方法內初始化要畫的圖形所需要的工具,例如:我們要畫一個三角形。首先我

Android 定義 Dialog 佈局設定高度 wrap_content 無效

以前的一個 Dialog 的自定義佈局的根佈局的寬度是寫死的,高度是 wrap_content 的。後來加了幾行內容後,發現內容總是顯示不全,高度沒有自適應,似乎變成了一個固定高度。根佈局是一個垂直的 LinearLayout,之前的內容比較少,所以沒發現問題。這期在底部添加

Android定義View-TitleBar標題欄詳細說明

我們在開發Android介面時常常要在許多頁面中共用風格相似的標題欄,為了減少重複性工作我們可以將標題欄做成一個通用的自定義控制元件。 我將通過兩種形式的自定義方式介紹自定義TitleBar 第一種方式(不涉及自定義屬性) 首先通過在Layout中建一個佈局檔案先確定Ti

Android定義控制元件-給定義控制元件新增事件

在這篇部落格中主要講解給Android自定義控制元件新增點選事件,實現可以按住百分比圓圈在螢幕上進行拖動圓圈的功能。分兩部分講,第一部分是獲取自定義控制元件的座標,第二部分是重新繪製控制元件。 第一部分:獲取自定義控制元件座標 首先看一張圖,這是自定義控制元件中獲

android定義View學習----建立一個檢視類

建立一個檢視類 精心設計的自定義檢視與其他精心設計的類非常相似。它使用易於使用的介面封裝了一組特定的功能,它可以高效地使用CPU和記憶體,等等。不過,作為一個設計良好的班級,自定義檢視應該: 符合Android標準 提供適用於Android XML佈局的自

Android定義控制元件 下拉重新整理上拉分頁載入更多(支援ListView, GridView, ScrollView)

        首先說明,這幾篇文章是對一些前輩的成果進行學習後的心得總結。也借這種方式對他們表示謝意。         最近專案中好幾個模組都用到listview和gridview的下拉重新整理,上拉載入更多等功能,而且涉及到圖片的批量下載。水平有限,首先是想到找一些比較

Android定義照相機實現拍照、儲存到SD卡利用Bundle在Acitivity交換資料

Android自定義照相機實現 近期小巫在學校有一個創新專案,也不是最近,是一個拖了很久的專案,之前一直沒有去搞,最近因為要中期檢查,搞得我跟小組成員一陣忙活,其實開發一款照相機軟體並不太難,下面就是通過自定義的方式來實現手機照相的功能。 建立一個專案:FingerTake

Android 定義Camera相機封裝工具類賊簡單

背景 目前公司的專案都是,針對生物認證來進行一些驗證之類的功能,比方說,互動式活體檢測,人臉1v1(對比),人臉1vN(搜尋)。用系統自帶的相機?當然是不夠用了,不夠用那就自定義啦,就像是前幾天七夕,沒物件怎麼辦,當然是new一個了。對了結尾還提供了一個呼叫極

Android 定義數字鍵盤定義輸入框

Android 自定義數字鍵盤(一) Android 自定義數字鍵盤(二)隨機數字 Demo地址:https://github.com/danfengfirst/KeyDemo 這篇部落格是在上面兩篇部落格的基礎上修改的一個相對比較完整的demo,