Android开发经验总结篇Android知识

有无网络页面的切换

2018-03-01  本文已影响24人  zhengLH

【需求】
在无网络的时候显示特定的页面,想到要替换页面的地方,大多都是
recyclerview或者第三方recyclerview这种需要显示数据的地方,那怎么替换掉
页面中所有的recyclerview为无网络页面?

有网络.png 无网络.png

【重点】如何知道 监听 网络的连接状态?
【答案】onWindowFocusChanged()方法
【错误】坚决不可以 在 onCreat() 或者 onResume() 方法中 处理,因为这些方法只是会被调用一次而已,而网络监听 需要实时监听,从逻辑上走不通。

【思路】
(1)在BaseActivity中,当加载布局成功以后,通过id找到要替换的view,通过indexOfChild()方法,找到要替换的view的位置,再通过remove和add view来实现,因为是在base替换,而且使用的是findviewById,这样子就省去了考虑fragment中的view,局限性是要替换的view的命名必须要统一。

(2)点击按钮重新请求数据,需要重新刷新数据,因此使用了无网络页面的act需要重写base的刷新数据方法,去重新请求数据。

【注意】

  onWindowFocusChanged()方法: 当Activity的window获得焦点或者失去焦点时候被调用。

(1) boolean hasFocus: 当页面渲染完成填充数据后 就可以获得焦点

【完整代码】

 /**
 * @Author Lee
 * @Time 2018/3/1
 * @Theme 实现无网络页面切换
 */

public class NoNetActivity extends AppCompatActivity {

private boolean haveShowNetView = false;

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

}



@Override
public void onWindowFocusChanged(boolean hasFocus) {
    super.onWindowFocusChanged(hasFocus);
    if (hasFocus) {
        initNoNetView( R.id.rv);    // 只要获得焦点,改方法就会被执行。
    }
}


private void initNoNetView(int... ids) {

    if (!NetUtil.isConnected(NoNetActivity.this) && ! haveShowNetView) {
        final List<View> viewList = new ArrayList<>();

        //通过id获取view
        for (int id : ids) {
            viewList.add(findViewById(id));
        }

        //实现自己的无网络页面
        final View noNetView = View.inflate(NoNetActivity.this, R.layout.layout_no_net, null);
        noNetView.findViewById(R.id.btn_try).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (!NetUtil.isConnected(NoNetActivity.this)) {
                    Toast.makeText(NoNetActivity.this, "没有获取到网络,请重试...", Toast.LENGTH_SHORT).show();
                    return;
                }

                //切换到有网络页面
                showHaveNetView(viewList, noNetView);
            }
        });

        //切换到无网络页面
        showNoNetView(viewList, noNetView);
    }
}

private void showHaveNetView(List<View> viewList, View noNetView) {
    for (View view : viewList) {
        if (view == null) {
            continue;
        }
        haveShowNetView = false;
        transView(noNetView, view);
        onReNetRefreshData();
        break;
    }
}

private void showNoNetView(List<View> viewList, View noNetView) {
    for (View view : viewList) {
        if (view == null) {
            continue;
        }
        haveShowNetView = true;
        transView(view, noNetView);
        break;
    }
}


/**
 * 没有网络 重新刷新   各个页面需要重写这个方法
 */
public abstract void onReNetRefreshData() { }


/**
 * 切换 有网络界面 和 无网络界面
 * @param defaultView
 * @param replaceView
 */
protected void transView(final View defaultView, View replaceView) {


    final int index = ((ViewGroup) defaultView.getParent()).indexOfChild(defaultView);
    ViewGroup.LayoutParams params = defaultView.getLayoutParams();
    ViewGroup parent = (ViewGroup) defaultView.getParent();
    parent.removeView(defaultView);
    parent.addView(replaceView, index, params);
}
}

【判断网络状态】 NetUtil 工具类

 /**
 * @Author Lee
 * @Time 2018/3/1
 * @Theme 判断网络状态
  */

public class NetUtil {

/**
 * 判断网络是否连接
 *
 * @param context
 * @return
 */
public static boolean isConnected(Context context) {

    ConnectivityManager connectivity = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
    if (null != connectivity) {
        NetworkInfo info = connectivity.getActiveNetworkInfo();
        if (null != info && info.isConnected()) {
            if (info.getState() == NetworkInfo.State.CONNECTED) {
                return true;
            }
        }
    }
    return false;
    }
 }

【无网络 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:gravity="center"
android:orientation="vertical">

<TextView
    android:id="@+id/tv_no_net_content"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:textSize="@dimen/textSize_20sp"
    android:text="网络丢失啦,请点击按钮重试..."/>

<Button
    android:id="@+id/btn_try"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginTop="@dimen/margin_20dp"
    android:paddingLeft="@dimen/padding_25dp"
    android:paddingRight="@dimen/padding_25dp"
    android:textSize="@dimen/textSize_18sp"
    android:text="点击重试"/>

   </LinearLayout>

【来源】 https://www.jianshu.com/p/fddfc7b4158b

上一篇下一篇

猜你喜欢

热点阅读