本库是基于该项目进行的二次封装:
https://github.com/AlarmZeng/NetworkStateView
这个库是集成了如下功能:
为何要封装?
- 1.主要是工作中用到了多种网络状态切换,然后同事一看对我说,“你这用着不爽,每个类都要去include一下。不开心”。
- 2.将网络监测相关代码汇总到NetObserverActivity,NetObserverAppCompatActivity,NetObserverFragment,详见Demo。
我们的目标是!没有蛀牙! 让网络状态View逻辑上变得简单。
super.initNetState(rootView);//rootView是页面根布局
<com.netstatus.NetLinearWrapContainer xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/transparent"
android:orientation="vertical"
tools:context="com.sound.haolei.operate.ui.fragment.HomeFragment">
关注的这3个点,便可以轻松的使用这个库。(其实本人还想再将这3个点省去,但是奈何水平有限,还是会产生一定的侵入代码)
allprojects {
repositories {
...
maven { url 'https://www.jitpack.io' }
}
}
dependencies {
compile 'com.github.zj614android:netstateview:1.0.0'
}
若想修改源码时,可以:
compile project(':netstateview')
参考原项目
xml
"1.0" encoding="utf-8"?>
"http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="demo.netstate.com.netstatedemo.LittleActivity">
"@layout/view_network_state" />
"wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_marginTop="20dp"
android:text="突突突~突突~"
android:textSize="30sp" />
java代码
package demo.netstate.com.netstatedemo;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import com.netstatus.NetworkStateView;
public class LittleActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_little);
com.netstatus.NetworkStateView nv = (NetworkStateView) findViewById(R.id.nsv_state_view);
nv.showLoading();
}
}
xml
<com.netstatus.NetLinearWrapContainer 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"
android:gravity="center"
android:orientation="vertical">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_marginTop="20dp"
android:text="突突突~突突~"
android:textSize="30sp" />
com.netstatus.NetLinearWrapContainer>
java代码
package demo.netstate.com.netstatedemo;
import android.os.Bundle;
import demo.netstate.com.netstatedemo.base.BaseAppCompatActivity;
public class CommonActivity extends BaseAppCompatActivity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_common);
}
}
NetLinearWrapContainer & extends BaseAppCompatActivit做了这些事:
- 自动往根布局里添加状态视图,注意目前只支持vertical的NetLinearWrapContainer
- 自动注册网络监测
- 根据网络状态变化自动切换视图
- 支持自定义属性,是否拥有titleBar
这只是普通activity内的,还有fragment和带有actionbar的activity的使用方式。详细见demo
"1.0" encoding="utf-8"?>
"NetLinearWrapContainer">
"haveActionBar" format="boolean" />
这个属性的作用是啥呢?当界面内需要用网络视图布局覆盖的组件有ActionBar的时候,那么这时候你就应该设置这个属性为true那么这个Ui会自动添加到布局元素的index2,布局的index机制请自行百度。
app:haveActionBar=”true”
<com.netstatus.NetLinearWrapContainer 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"
android:gravity="center"
app:haveActionBar="true"
android:orientation="vertical">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_marginTop="20dp"
android:text="突突突~突突~"
android:textSize="30sp" />
com.netstatus.NetLinearWrapContainer>
根布局用这个组件进行布局的时候,由于他是一个LinearLayout,且只支持vertical。
NetObserverActivity.java
NetObserverAppCompatActivity.java
NetObserverFragment.java
这三个类是封装类,里边做了网络状态相关的初始化,具体怎么集成,可以看Demo内的Base基类是如何封装的。
可选的 Override 3个回调(你不想用可以不写):
public interface OnRefreshListener {
/**
* 空的刷新按钮
*/
void netWorkStatusEmptyRefresh();
/**
* 网络错误刷新按钮
*/
void netWorkStatusErrorRefresh();
/**
* 没有网络刷新按钮
*/
void netWorkStatusNoNetWorkRefresh();
}
$NetObserverAppCompatActivity.java
/**
* NetStatus相关
*/
protected void showEmpty(){
if(null != mNetworkStateView){
mNetworkStateView.showEmpty();
}else {
Log.e("NetState","mNetworkStateView为空");
}
}
/**
* NetStatus相关
*/
protected void showSuccess(){
if(null != mNetworkStateView){
mNetworkStateView.showSuccess();
}else {
Log.e("NetState","mNetworkStateView为空");
}
}
/**
* NetStatus相关
*/
protected void showNoNet(){
if(null != mNetworkStateView){
mNetworkStateView.showNoNetwork();
}else {
Log.e("NetState","mNetworkStateView为空");
}
}
/**
* NetStatus相关
*/
protected void showError(){
if(null != mNetworkStateView){
mNetworkStateView.showError();
}else {
Log.e("NetState","mNetworkStateView为空");
}
}
详见Demo
GitHub项目地址
结合网络请求使用的Demo
基本接入使用的Demo
最后,后面我会补上实现细节,并发一个帖子,有错误的地方请直接指出,我会修正改进,感谢。