本文介绍了Android 实现无网络页面切换的示例代码,分享给大家,具体如下:

实现思路
需求是在无网络的时候显示特定的页面,想到要替换页面的地方,大多都是recyclerview或者第三方recyclerview这种需要显示数据的地方,因此决定替换掉页面中所有的recyclerview为无网络页面
实现过程
1 在BaseActivity中,当加载布局成功以后,通过id找到要替换的view,通过indexOfChild()方法,找到要替换的view的位置,再通过remove和add view来实现,因为是在base替换,而且使用的是findviewById,这样子就省去了考虑fragment中的view,局限性是要替换的view的命名必须要统一
2 点击按钮重新请求数据,需要重新刷新数据,因此使用了无网络页面的act需要重写base的刷新数据方法,去重新请求数据。
优缺点
因为只在base中替换,因此要替换的view,id名需要一致,对比通过decorview拿到content之后遍历所有控件获取到要替换的view的方法效率更高,而且省去了考虑fragment的情况,通过findViewById()方法可以直接获取到fragment中需要替换的recyclerview。
代码实现
在加载布局成功初始化无网络页面
@Override
public void onWindowFocusChanged(boolean hasFocus) {
super.onWindowFocusChanged(hasFocus);
if (hasFocus) {
initNoNetView(R.id.id_xrv,R.id.rv);
}
}
需要一个工具类用来获取网络状态
/**
* 判断网络是否连接
*
* @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;
}
初始化无网络页面,定义一个不定长的view的id组成的数组,参数为需要替换的view的共同的id,可以为多个,会替换第一个找到的不为null的view。
private void initNoNetView(int ...ids) {
if (!OkHttpUtil.isConnected(BaseActivity.this) && !haveShowNetView) {
final List<View> viewList = new ArrayList<>();
//通过id获取view
for (int id : ids) {
viewList.add(findViewById(id));
}
//实现自己的无网络页面
final View noNetView = View.inflate(BaseActivity.this, R.layout.layout_no_net, null);
noNetView.findViewById(R.id.btn_try).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (!OkHttpUtil.isConnected(BaseActivity.this)) {
T.showShort(BaseActivity.this, "没有获取到网络,请重试...");
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;
}
}
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);
}
点击按钮显示有网络页面的时候通知页面更新数据,BaseAct为空实现,需要更新数据的页面重写onReNetRefreshData()方法。
public void onReNetRefreshData() {
}
整体代码
private boolean haveShowNetView = false;
@Override
public void onWindowFocusChanged(boolean hasFocus) {
super.onWindowFocusChanged(hasFocus);
if (hasFocus) {
initNoNetView(R.id.id_xrv,R.id.rv);
}
}
private void initNoNetView(int ...ids) {
if (!OkHttpUtil.isConnected(BaseActivity.this) && !haveShowNetView) {
final List<View> viewList = new ArrayList<>();
//通过id获取view
for (int id : ids) {
viewList.add(findViewById(id));
}
//实现自己的无网络页面
final View noNetView = View.inflate(BaseActivity.this, R.layout.layout_no_net, null);
noNetView.findViewById(R.id.btn_try).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (!OkHttpUtil.isConnected(BaseActivity.this)) {
T.showShort(BaseActivity.this, "没有获取到网络,请重试...");
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 void onReNetRefreshData() {
}
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);
}
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
# Android
# 无网络页面切换
# 实现页面切换
# Android实现移动小球和CircularReveal页面切换动画实例代码
# Android中TabLayout结合ViewPager实现页面切换
# Android 中使用 ViewPager实现屏幕页面切换和页面轮播效果
# Android开发中ViewPager实现多页面切换效果
# Android中TabLayout结合ViewPager实现页面切换效果
# Android中使用TabHost 与 Fragment 制作页面切换效果
# Android使用Fragment打造万能页面切换框架
# Android编程之页面切换测试实例
# Android fragment实现多个页面切换效果
# 切换到
# 自己的
# 是在
# 重写
# 的是
# 都是
# 定长
# 加载
# 第一个
# 多个
# 遍历
# 请重试
# 给大家
# 更高
# 可以直接
# 只在
# 不为
# 第三方
# 这样子
# 来实现
相关文章:
如何获取上海专业网站定制建站电话?
如何在云主机快速搭建网站站点?
建站主机如何选?性能与价格怎样平衡?
如何通过虚拟主机快速搭建个人网站?
陕西网站制作公司有哪些,陕西凌云电器有限公司官网?
如何设置并定期更换建站之星安全管理员密码?
如何选择PHP开源工具快速搭建网站?
建站之星收费标准详解:套餐费用及年费价格表一览
青岛网站建设如何选择本地服务器?
网站制作难吗安全吗,做一个网站需要多久时间?
建站之星CMS五站合一模板配置与SEO优化指南
建站之星安装失败:服务器环境不兼容?
南平网站制作公司,2025年南平市事业单位报名时间?
微课制作网站有哪些,微课网怎么进?
建站主机选购指南:核心配置优化与品牌推荐方案
定制建站方案优化指南:企业官网开发与建站费用解析
,怎么在广州志愿者网站注册?
如何在宝塔面板中修改默认建站目录?
如何访问已购建站主机并解决登录问题?
建站主机与服务器功能差异如何区分?
如何在Tomcat中配置并部署网站项目?
开心动漫网站制作软件下载,十分开心动画为何停播?
开封网站制作公司,网络用语开封是什么意思?
如何高效生成建站之星成品网站源码?
建站之星免费版是否永久可用?
制作网站的公司有哪些,做一个公司网站要多少钱?
中山网站制作网页,中山新生登记系统登记流程?
如何在Windows环境下新建FTP站点并设置权限?
制作表格网站有哪些,线上表格怎么弄?
微网站制作教程,不会写代码,不会编程,怎么样建自己的网站?
湖南网站制作公司,湖南上善若水科技有限公司做什么的?
天河区网站制作公司,广州天河区如何办理身份证?需要什么资料有预约的网站吗?
如何在橙子建站上传落地页?操作指南详解
巅云智能建站系统:可视化拖拽+多端适配+免费模板一键生成
如何在局域网内绑定自建网站域名?
建站之星伪静态规则如何设置?
佛山网站制作系统,佛山企业变更地址网上办理步骤?
建站之星后台密码遗忘或太弱?如何重置与强化?
国美网站制作流程,国美电器蒸汽鍋怎么用官方网站?
如何彻底卸载建站之星软件?
已有域名如何免费搭建网站?
建站之星如何防范黑客攻击与数据泄露?
番禺网站制作公司哪家值得合作,番禺图书馆新馆开放了吗?
建站之星安装需要哪些步骤及注意事项?
详解jQuery停止动画——stop()方法的使用
义乌企业网站制作公司,请问义乌比较好的批发小商品的网站是什么?
如何快速选择适合个人网站的云服务器配置?
深入理解Android中的xmlns:tools属性
如何在企业微信快速生成手机电脑官网?
建站之星免费模板:自助建站系统与智能响应式一键生成
*请认真填写需求信息,我们会在24小时内与您取得联系。