1. 程式人生 > >android介面空資料,沒網路的背景互動

android介面空資料,沒網路的背景互動

直接效果圖(這是模擬了一個沒有網路的時候得圖)

看下自定義的一個EmptyLayout:(來源於開源中國)因為沒什麼難度就直接貼程式碼了

package com.example.baselayoutapp;

import android.content.Context;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.telephony.TelephonyManager;
import android.util.AttributeSet;
import android.view.View;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ProgressBar;
import android.widget.RelativeLayout;
import android.widget.TextView;
/**
 * 
 * @author 開源中國
 *
 */
public class EmptyLayout extends LinearLayout implements android.view.View.OnClickListener {
	//載入成功 不顯示emptylayout了
	public static final int HIDE_LAYOUT = 4;
	//網路沒有連線
	public static final int NETWORK_ERROR = 1;
	//正在載入資料
	public static final int NETWORK_LOADING = 2;
	//沒有資料
	public static final int NODATA = 3;
	
	public static final int NODATA_ENABLE_CLICK = 5;

	private ProgressBar animProgress;
	private boolean clickEnable = true;
	private final Context context;
	public ImageView img;
	private android.view.View.OnClickListener listener;
	private int mErrorState;
	private String strNoDataContent = "";
	private TextView tv;

	public EmptyLayout(Context context) {
		super(context);
		this.context = context;
		init();
	}

	public EmptyLayout(Context context, AttributeSet attrs) {
		super(context, attrs);
		this.context = context;
		init();
	}

	private void init() {
		View view = View.inflate(context, R.layout.view_error_layout, null);
		img = (ImageView) view.findViewById(R.id.img_error_layout);
		tv = (TextView) view.findViewById(R.id.tv_error_layout);
		RelativeLayout mLayout = (RelativeLayout) view.findViewById(R.id.pageerrLayout);
		animProgress = (ProgressBar) view.findViewById(R.id.animProgress);
		setBackgroundColor(-1);
		setOnClickListener(this);
		img.setOnClickListener(new View.OnClickListener() {
			@Override
			public void onClick(View v) {
				if (clickEnable) {
					// setErrorType(NETWORK_LOADING);
					if (listener != null)
						listener.onClick(v);
				}
			}
		});
		addView(view);
		changeErrorLayoutBgMode(context);
	}

	public void changeErrorLayoutBgMode(Context context1) {
		// mLayout.setBackgroundColor(SkinsUtil.getColor(context1,
		// "bgcolor01"));
		// tv.setTextColor(SkinsUtil.getColor(context1, "textcolor05"));
	}

	public void dismiss() {
		mErrorState = HIDE_LAYOUT;
		setVisibility(View.GONE);
	}

	public int getErrorState() {
		return mErrorState;
	}

	public boolean isLoadError() {
		return mErrorState == NETWORK_ERROR;
	}

	public boolean isLoading() {
		return mErrorState == NETWORK_LOADING;
	}

	@Override
	public void onClick(View v) {
		if (clickEnable) {
			// setErrorType(NETWORK_LOADING);
			if (listener != null)
				listener.onClick(v);
		}
	}

	@Override
	protected void onAttachedToWindow() {
		super.onAttachedToWindow();
		onSkinChanged();
	}

	@Override
	protected void onDetachedFromWindow() {
		super.onDetachedFromWindow();
	}

	public void onSkinChanged() {
	}

	public void setErrorMessage(String msg) {
		tv.setText(msg);
	}

	/**
	 * 新添設定背景
	 * @param imgResource 圖片的id
	 * @param msg  圖片下面的textView顯示的文字
	 * 
	 */
	public void setErrorImag(int imgResource,String msg) {
		try {
			img.setBackgroundResource(imgResource);
			tv.setText(msg);
		} catch (Exception e) {
		}
	}

	public void setErrorType(int i) {
		setVisibility(View.VISIBLE);
		switch (i) {
		case NETWORK_ERROR:
			mErrorState = NETWORK_ERROR;
			if (isConnectivity(context)) {
				tv.setText(R.string.error_view_load_error_click_to_refresh);
				img.setBackgroundResource(R.drawable.pagefailed_bg);
			} else {
				tv.setText(R.string.error_view_network_error_click_to_refresh);
				img.setBackgroundResource(R.drawable.page_icon_network);
			}
			img.setVisibility(View.VISIBLE);
			animProgress.setVisibility(View.GONE);
			clickEnable = true;
			break;
		case NETWORK_LOADING:
			mErrorState = NETWORK_LOADING;
			animProgress.setVisibility(View.VISIBLE);
			img.setVisibility(View.GONE);
			tv.setText(R.string.error_view_loading);
			clickEnable = false;
			break;
		case NODATA:
			mErrorState = NODATA;
			img.setBackgroundResource(R.drawable.page_icon_empty);
			img.setVisibility(View.VISIBLE);
			animProgress.setVisibility(View.GONE);
			setTvNoDataContent();
			clickEnable = true;
			break;
		case HIDE_LAYOUT:
			setVisibility(View.GONE);
			break;
		case NODATA_ENABLE_CLICK:
			mErrorState = NODATA_ENABLE_CLICK;
			img.setBackgroundResource(R.drawable.page_icon_empty);
			img.setVisibility(View.VISIBLE);
			animProgress.setVisibility(View.GONE);
			setTvNoDataContent();
			clickEnable = true;
			break;
		default:
			break;
		}
	}

	public void setNoDataContent(String noDataContent) {
		strNoDataContent = noDataContent;
	}

	public void setOnLayoutClickListener(View.OnClickListener listener) {
		this.listener = listener;
	}

	public void setTvNoDataContent() {
		if (!strNoDataContent.equals(""))
			tv.setText(strNoDataContent);
		else
			tv.setText(R.string.error_view_no_data);
	}

	@Override
	public void setVisibility(int visibility) {
		if (visibility == View.GONE)
			mErrorState = HIDE_LAYOUT;
		super.setVisibility(visibility);
	}

	
	
	
	/**
	 * 
	 * 描述:是否有網路連線.androidbase中AbWifiUtil中的方法
	 * @param context
	 * @return
	 */
	public static boolean isConnectivity(Context context) {
		
		ConnectivityManager connectivityManager = (ConnectivityManager) context
				.getSystemService(Context.CONNECTIVITY_SERVICE);
		TelephonyManager telephonyManager = (TelephonyManager) context
				.getSystemService(Context.TELEPHONY_SERVICE);
		return ((connectivityManager.getActiveNetworkInfo() != null && connectivityManager
				.getActiveNetworkInfo().getState() == NetworkInfo.State.CONNECTED) || telephonyManager
				.getNetworkType() == TelephonyManager.NETWORK_TYPE_UMTS);
	}
	
}

然後就是activity中的使用了:
private void initView() {
		mErrorLayout = (EmptyLayout) findViewById(R.id.empty_view);
		mListView = (ListView) findViewById(R.id.list);
		mErrorLayout.setOnLayoutClickListener(new View.OnClickListener() {
	            @Override
	            public void onClick(View v) {
	                virtulHttp();
	            }
		 });
		
	}
	//模擬網路請求資料
	private  void virtulHttp(){
		mErrorLayout.setErrorType(EmptyLayout.NETWORK_LOADING);
		new Thread(new Runnable() {
			@Override
			public void run() {
				try {
					Thread.sleep(1000);
					if(EmptyLayout.isConnectivity(MainActivity.this)){//有沒有網
						data = new String[]{"啦","啦啦","啦啦啦"};
						adapter = new ArrayAdapter<String>(MainActivity.this, android.R.layout.simple_expandable_list_item_1, android.R.id.text1,data );
					}else{
						data = new String[]{};
					}
					mHandler.sendEmptyMessage(0);
					
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
		}).start();
	}
	Handler mHandler = new Handler(){
		public void handleMessage(android.os.Message msg) {
			if(null!=adapter){
				mListView.setAdapter(adapter);
				mErrorLayout.setErrorType(EmptyLayout.HIDE_LAYOUT);
			} else if (0==data.length){
				if(EmptyLayout.isConnectivity(MainActivity.this)){//網路連線問題
					mErrorLayout.setErrorType(EmptyLayout.NODATA);
					return;
				}
				mErrorLayout.setErrorType(EmptyLayout.NETWORK_ERROR);
			}
		};
	};
佈局檔案是
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

   
  <ListView
        android:id="@+id/list"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
         />
   <com.example.baselayoutapp.EmptyLayout
        android:id="@+id/empty_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        />

</RelativeLayout>

最後貼下demo下載地址:http://www.oschina.net/code/snippet_2702417_57579

相關推薦

android介面資料網路背景互動

直接效果圖(這是模擬了一個沒有網路的時候得圖) 看下自定義的一個EmptyLayout:(來源於開源中國)因為沒什麼難度就直接貼程式碼了 package com.example.baselayoutapp; import android.content.Context;

資料庫有資料但查詢不到資料查到還爆指標

              今天在做springMVC專案的時候,因為粗心,忘了在控制層注入service的類上面加上@Autowired,執行程式碼就一直報空指標,把hql翻譯成sql放入資料庫查詢

報表統計——java實現查詢某年某月每天資料資料補0

一般圖表繪製例如echarts等,返回資料格式都大同小異。重點是利用sql或者java實現資料格式的轉型,接下來是關鍵部分: 1.前提1:提供的工具方法——獲取某月有多少天 //通過年份和月份確定該月的最後一天 public static int getMaxDay(int year,in

Android Retrofit使用指南網路請求更簡單。

Retrofit與okhttp都是Square公司的出品,Retrofit是對okhttp做了一層封裝,只要簡單的配置,就可以是用Retrofit。 github地址: Gradle依賴: c

解決dataTables再次呼叫不能清資料解決Cannot reinitialise DataTable問題

$('#example').DataTable({ searching:false, //去掉搜尋框 bLengthChange:false,//去掉每頁多少條框體 "language": { "info": "", // 表格左下角

關於如何取出非同步執行緒裡的資料例如網路請求回來的物件陣列

最近搞自己手頭的專案時遇到了一個問題,就是使用okhttp向伺服器請求資料回來,在它的介面方法中獲取到了資料,但是賦值給一個全域性的list的時候發現這個list並沒有被賦值,為空,但是在okhttp的onResponse()中確實已經賦值成功了,但是到了外部發現沒有,仔細想想,okhttp的onR

android頁面滑動時頂部title背景漸變的實現

在淘寶的商品詳情頁,我們會看到頂部的title背景顏色隨著scrollView的上下滑動而漸變,這樣的功能在我們應用中會經常用到,今天就來說一下我實現下這種功能方法,當然方法可能比較笨,看到部落格的大牛,希望能得到你們的指點。 先晒幾張效果圖:              

android介面之美---自定義網路請求進度載入對話方塊

1.定義進度對話方塊類 <span style="font-size:18px;">public class ProgressDialog { public Dialog mDialo

java用post方法獲取json資料與伺服器進行互動

下載好以後匯入依賴包,下面sendInfo方法就是互動方法,可以直接拿去用: public static String sendInfo(String sendurl, String data)

Native Socket.IO and Android ( socket請求與伺服器的互動

使用GitHub上開源框架實現socket1.在build檔案中引入:compile 'com.github.nkzawa:socket.io-client:0.3.0'-- 連結 : https://github.com/nkzawa/socket.io-android-

解決Android啟動顯示空白介面的問題自定義進入軟體前的背景圖片

1.新建xml檔案 設定其背景圖片 android:background="@mipmap/initmap" <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android=

Android訪問網路系列之--服務端返回XML或JSON格式資料Android 進行解析並顯示

例子說明:使用者通過訪問web資源的最新電影資訊,伺服器端生成XML或JSON格式資料,返回Android客戶端進行顯示。 此案例開發需要兩個方面 WEB開發和android開發. 一.web開發相對比較簡單,只是模擬一下 相關程式碼如下: 1.實體Bean package ygc.yxb.domain

Android訪問網路:服務端返回XML或JSON格式資料Android 進行解析並使用ListView顯示

剛剛入門學習了Android的ListView,也是看了傳智播客黎活明老師的視訊學習了,但是一直執行不了,還報錯了。報的錯誤是:at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.jav

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

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

Android中檢查網路連線狀態的變化網路時跳轉到設定介面

在AndroidManifest.xml中加一個許可權 <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <intent-filter>

android studio 中判斷是否有網路並且跳轉到設定網路介面的工具類

在使用app的情況下,我們需要判斷使用者是否有網路,並提示跳轉到設定網路的介面,可以封裝成一個工具類(判斷是否有網) public boolean isConn(Context context){ //1.得到網路管理類  ConnectivityManager manag

Android實現個人資料頁面頭像背景模糊顯示包括狀態列

public class FastBlurUtils { public static Bitmap doBlur(Bitmap sentBitmap, int radius, boolean canReuseInBitmap) {

新機首次安裝 app請求網路許可權“是否允許使用資料點允許後首頁資料

      現在發現一個問題,在iOS10以上中,當app在手機第一次安裝的時候,蘋果會預設彈出一個是否允許app使用資料的彈框,允許後首頁一片空白,之前做那個app沒在關注過這一次,因為首頁有下拉重新整理這個功能,並且這個問題是這個裝置第一次安裝才出現,也沒太關注過這個問

Blazui 常見問題:我更新了資料為什麼介面重新整理?

首發於:http://www.blazor.group:8000/topic/reply?tpid=9 開門見山,不介紹,不廢話 建議食用本文前先食用 https://www.cnblogs.com/wzxinchen/p/12082136.html 正常情況下,Blazor 的介面是怎樣重新整理的? Bla

Jupyter notebook執行出錯瀏覽器頁面為資料

用conda裝了好多遍jupyter notebook都不好使,每次下到一大半網路出錯。 改用pip安裝後,還是出現一個問題。命令列顯示對比正常執行情況主要多了兩行問題: 1.forbidden403    2.'_xsrf' argument missing fro