有无网络页面的切换
2018-03-01 本文已影响24人
zhengLH
【需求】
在无网络的时候显示特定的页面,想到要替换页面的地方,大多都是
recyclerview或者第三方recyclerview这种需要显示数据的地方,那怎么替换掉
页面中所有的recyclerview为无网络页面?
【重点】如何知道 监听 网络的连接状态?
【答案】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>