前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >3.加载界面

3.加载界面

作者头像
六月的雨
发布于 2018-05-14 03:35:17
发布于 2018-05-14 03:35:17
71500
代码可运行
举报
文章被收录于专栏:Android开发指南Android开发指南
运行总次数:0
代码可运行

1.  四种界面: 加载中, 加载错误,加载为空 ,加载成功

2.  根据不同的状态去切换界面

HomeFragment

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class HomeFragment extends Fragment {
 public static final int STATE_UNKOWN = 0;
 public static final int STATE_LOADING = 1;
 public static final int STATE_ERROR = 2;
 public static final int STATE_EMPTY = 3;
 public static final int STATE_SUCCESS = 4;
 public static int state = STATE_UNKOWN;
 @Override
 public View onCreateView(LayoutInflater inflater, ViewGroup container,
 Bundle savedInstanceState) {
 if (frameLayout == null) { 
// 之前的frameLayout 已经记录了一个爹了 爹是之前的ViewPager,先干掉之前的爹
			frameLayout = new FrameLayout(getActivity());
			init(); // 在FrameLayout中 添加4种不同的界面
 } else {
 ViewUtils.removeParent(frameLayout);// 移除frameLayout之前的爹
 }
		show();// 根据服务器的数据 切换状态
 return frameLayout; // 拿到当前viewPager 添加这个framelayout
 }
 private View loadingView;// 加载中的界面
 private View errorView;// 错误界面
 private View emptyView;// 空界面
 private View successView;// 加载成功的界面
 private FrameLayout frameLayout;
 // 在FrameLayout中 添加几种不同的界面
 private void init() {
		loadingView = createLoadingView(); // 创建了加载中的界面
 if (loadingView != null) {
			frameLayout.addView(loadingView, new FrameLayout.LayoutParams(
 LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));
 }
		errorView = createErrorView(); // 加载错误界面
 if (errorView != null) {
			frameLayout.addView(errorView, new FrameLayout.LayoutParams(
 LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));
 }
		emptyView = createEmptyView(); // 加载空的界面
 if (emptyView != null) {
			frameLayout.addView(emptyView, new FrameLayout.LayoutParams(
 LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));
 }
		showPage();// 根据不同的状态显示不同的界面
 }
 // 根据不同的状态显示不同的界面
 private void showPage() {
 if (loadingView != null) {
			loadingView.setVisibility(state == STATE_UNKOWN
 || state == STATE_LOADING ? View.VISIBLE : View.INVISIBLE);
 }
 if (errorView != null) {
			errorView.setVisibility(state == STATE_ERROR ? View.VISIBLE
 : View.INVISIBLE);
 }
 if (emptyView != null) {
			emptyView.setVisibility(state == STATE_EMPTY ? View.VISIBLE
 : View.INVISIBLE);
 }
 if (state == STATE_SUCCESS) {
			successView = createSuccessView();
 if (successView != null) {
				frameLayout.addView(successView, new FrameLayout.LayoutParams(
 LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));
				successView.setVisibility(View.VISIBLE);
 }
 }
 }
 private View createSuccessView() {
 TextView tv = new TextView(getActivity());
		tv.setText("加载成功了....");
		tv.setTextSize(30);
 return tv;
 }
//枚举,相当于内部类
 public enum LoadResult {
		error(2), empty(3), success(4);
 int value;
 LoadResult(int value) {
 this.value = value;
 }
 public int getValue() {
 return value;
 }
 }
 // 根据服务器的数据 切换状态
 private void show() {
 if (state == STATE_ERROR || state == STATE_EMPTY) {
			state = STATE_LOADING;
 }
 // 请求服务器 获取服务器上数据 进行判断,模拟服务器
 // 请求服务器 返回一个结果
 new Thread() {
 public void run() {
 SystemClock.sleep(2000);//这个方法也能睡
 final LoadResult result = load();
 if (getActivity() != null) {
					getActivity().runOnUiThread(new Runnable() {//主线程刷新ui
 @Override
 public void run() {
 if (result != null) {
								state = result.getValue();
								showPage(); // 状态改变了,重新判断当前应该显示哪个界面
 }
 }
 });
 }
 };
 }.start();
		showPage();
 }
 private LoadResult load() {
 return LoadResult.success;
 }
 /* 创建了空的界面 */
 private View createEmptyView() {
 View view = View.inflate(getActivity(), R.layout.loadpage_empty, null);
 return view;
 }
 /* 创建了错误界面 */
 private View createErrorView() {
 View view = View.inflate(getActivity(), R.layout.loadpage_error, null);
 Button page_bt = (Button) view.findViewById(R.id.page_bt);
		page_bt.setOnClickListener(new OnClickListener() {
 @Override
 public void onClick(View v) {
				show();
 }
 });
 return view;
 }
 /* 创建加载中的界面 */
 private View createLoadingView() {
 View view = View
 .inflate(getActivity(), R.layout.loadpage_loading, null);
 return view;
 }
}

ViewUtils

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class ViewUtils {
 public static void removeParent(View v){
 //  先找到爹 在通过爹去移除孩子
 ViewParent parent = v.getParent();
 //所有的控件 都有爹  爹一般情况下 就是ViewGoup
 if(parent instanceof ViewGroup){
 ViewGroup group=(ViewGroup) parent;
			group.removeView(v);
 }
 }
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2015-11-16 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
常用的自定义View例子三(MultiInterfaceView多界面处理)
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/gdutxiaoxu/article/details/51804844
程序员徐公
2018/09/18
4050
常用的自定义View例子三(MultiInterfaceView多界面处理)
5.代码抽取(加载界面)
简单框架的搭建主要就是泛型T和抽象类(让子类去实现)的运用 抽取3中的代码,加载界面逻辑是一样的分别抽取到 BaseFragment和LoadingPage中。自定义布局如果不在布局写,那就直接new就可以 LoadingPage是自定义的帧布局 public abstract class LoadingPage extends FrameLayout { public static final int STATE_UNKOWN = 0; public static final int STATE_LOAD
六月的雨
2018/05/14
8130
android-自定义组合控件和 自定义组合控件不显示问题
代码实现参考自-Android群英传 首先定义 attrs 文件: 在定义 TopBar 类,使其继承自 ViewGroup ( 此处用RelatiLayout ) public class TopBar extends RelativeLayout { // 组件 private Button mLeftButton, mRightButton; private TextView mTitleView; // 布局元素 private LayoutParams m
圆号本昊
2021/09/24
1.5K0
android-自定义组合控件和 自定义组合控件不显示问题
打造万能的EmptyLayout
前言 最近一直在做新项目,做的途中也一直在思考,如何让开发更加的方便,界面的实现更加的优雅,于是,就去github稍微搜索了一下好的例子,结果不尽人意,要么太臃肿,要么移植难,要么结构不清晰,于是,就打算自己来实现一个 效果图 代码使用 LoadingLayout loadingLayout; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedI
codelang
2018/06/26
5090
Android开发(45) 自定义软键盘
在项目开发中遇到一个需求,”只要数字键盘的输入,仅仅有大写字母的输入,某些输入法总是会提示更新,弹出广告等“,使得我们需要自定义输入。
张云飞Vir
2020/03/16
1.8K0
11.菜单界面、详情界面
菜单界面 在MainActivity  的initView方法里 // 添加菜单 fl_menu=(FrameLayout) findViewById(R.id.fl_menu); MenuHo
六月的雨
2018/05/14
1.2K0
Flutter混合开发:启动黑屏处理
上一篇 Flutter混合开发:Android接入Flutter 我们讲到在 Flutter混合开发 中主要有、有 addView (页面局部Flutter) 和 setContentView (整个页面Flutter)两种方式。这两种方式在启动页面的时候都会遇到 FlutterView 出现黑屏的情况。
静默加载
2020/05/29
2.6K0
Android 自定义 MarqueeView 实现跑马灯 —— 原理篇
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/gdutxiaoxu/article/details/82429330
程序员徐公
2018/09/18
1.2K0
Android 自定义 MarqueeView 实现跑马灯 —— 原理篇
Android自定义View
前几天在郭霖大神的博客上看了自定义View的知识,感觉受益良多,大神毕竟大神。在此总结一下关于Android 自定义View的用法:
指点
2019/01/18
6450
Android自定义View
一个简单的页面加载管理类(包含加载中,加载失败,数据为空,加载成功)
在最近公布的比赛框架中,发现了页面加载管理类,觉得挺有用的,所以做个简单的笔记。 什么是页面加载管理类呢?(大佬可直接跳过翻看实现过程) 如果能有这个问题,那么很好,哈哈哈,你和我一样,刚开始都挺疑惑的。 我们一般在写网络请求的时候,如果不涉及什么MVP,或者别的,就一个简单网络请求,然后再成功的结果里刷新View,请求过程中总不能白屏吧,所以有些人可能会让转一个圈,或者显示加载中的布局,然后等成功后再隐藏掉,显示具体的布局view。这样的话,也没什么问题,但是如果你的状态需要多个,这个时候就很烦了。总
Petterp
2022/02/09
1.4K0
一个简单的页面加载管理类(包含加载中,加载失败,数据为空,加载成功)
我们经常用的Loading动画居然还有这种姿势
一般在需要用户等待的场景,显示一个Loading动画可以让用户知道App正在加载数据,而不是程序卡死,从而给用户较好的使用体验。
luckybilly
2019/04/02
7860
我们经常用的Loading动画居然还有这种姿势
ViewStub延迟加载
在项目中,难免会遇到这种需求,在程序运行时需要动态根据条件来决定显示哪个View或某个布局,最通常的想法就是把需要动态显示的View都先写在布局中,然后把它们的可见性设为View.GONE,最后在代码中通过控制View.VISIABLE动态的更改它的可见性。这样的做法的优点是逻辑简单而且控制起来比较灵活。但是它的缺点就是,耗费资源,虽然把View的初始可见View.GONE但是在Inflate布局的时候View仍然会被Inflate,也就是说仍然会创建对象,会被实例化,会被设置属性。也就是说,会耗费内存等资源。
全栈程序员站长
2022/09/13
1.7K0
ViewStub延迟加载
Android ActionBar应用实战,高仿微信主界面的设计
本文主要介绍了如何通过自定义View实现微信主界面的效果,包括TabHost、PagerSlidingTabStrip、ViewPager和Fragment等组件的配置和使用方法。同时,还介绍了一种实现滑动Tab效果的方案,以及自定义View和动态加载layout的技巧。
用户1158055
2018/01/05
1.5K0
Android ActionBar应用实战,高仿微信主界面的设计
我们经常用的Loading动画居然还有这种姿势
一般在需要用户等待的场景,显示一个Loading动画可以让用户知道App正在加载数据,而不是程序卡死,从而给用户较好的使用体验。
Android技术干货分享
2019/04/01
2.1K0
我们经常用的Loading动画居然还有这种姿势
10. 面向holder编程、自动轮询
没有看过上一篇文章的话,建议先去阅读GooglePlay:9.代码抽取(adapter) 项目框架的搭建: 以后每个view都是holder BaseHolder public abstract class BaseHolder<Data> {//写data和t一样 private View contentView; private Data data; protected BitmapUtils bitmapUtils; public BaseHolder(){ bitmapUtils
六月的雨
2018/05/14
7430
ListView专题
ListView专题 1.ListView属性: fadingEdge属性 ListView上边和下边有黑色的阴影,android : fadingEdge = "none"后就不会有阴影了 scrollbars属性,隐藏滚动条 android : scrollbars = "none" setVerticalScrollBarEnabled(true); fadeScrollbars属性 android : fadeScrollbars = "true" 设置此值为true就可以实现滚动
xiangzhihong
2018/01/26
1.2K0
为你的APP自定义一个统一的标题栏
通常的标题是分为几种? 输入图片说明 左边图标,左边文字, 中间文字 (修饰) , 右边文字, 右边图标 ** ContextTitle .java *
Xiaolei123
2018/06/28
5430
相关推荐
常用的自定义View例子三(MultiInterfaceView多界面处理)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验