NetworkStateView(1)——具备网络状态监听并自动切换的View

What?

本库是基于该项目进行的二次封装:
https://github.com/AlarmZeng/NetworkStateView

这个库是集成了如下功能:

  • 保留基本库原有的使用方式(对应不同网络状态的布局【参考】)
  • 网络判断工具类
  • 网络状态变化的广播
  • 对应封装的逻辑基类
  • 包装类:NetLinearWrapContainer

Why?

为何要封装?
- 1.主要是工作中用到了多种网络状态切换,然后同事一看对我说,“你这用着不爽,每个类都要去include一下。不开心”。
- 2.将网络监测相关代码汇总到NetObserverActivity,NetObserverAppCompatActivity,NetObserverFragment,详见Demo。

Target!

我们的目标是!没有蛀牙! 让网络状态View逻辑上变得简单。

也就是说要实现这样的效果时,我们只需要做如下操作:

NetworkStateView(1)——具备网络状态监听并自动切换的View_第1张图片

  • BaseActivity/BaseFragment extentds NetObserverActivity/NetObserverFragment
    • BaseActivity/BaseFragment 内编写如下代码:
      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个点省去,但是奈何水平有限,还是会产生一定的侵入代码)

Dependencies!

  • Step 1. Add it in your root build.gradle at the end of repositories:
allprojects {
        repositories {
            ...
            maven { url 'https://www.jitpack.io' }
        }
    }
  • Step 2. Add the dependency:
dependencies {
            compile 'com.github.zj614android:netstateview:1.0.0'
}

若想修改源码时,可以:

compile project(':netstateview')

How?

基础使用方式:

参考原项目

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

NetLinearWrapContainer包装类的使用:

基本:

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

Demo

GitHub项目地址
结合网络请求使用的Demo
基本接入使用的Demo

最后,后面我会补上实现细节,并发一个帖子,有错误的地方请直接指出,我会修正改进,感谢。

你可能感兴趣的:(android,自定义view)