Android 加载成功、加载失败、加载中、无数据四个不同界面的切换
2017-06-27 19:58
423 查看
自定义一个Framelayout来切换布局。
1.首先自定义一个Framelayout,用addview()把加载失败、加载中、无数据添加到Framelayout;因为加载成功的view是随时变化的,所以提供bindSuccessView()方法添加。
1.首先自定义一个Framelayout,用addview()把加载失败、加载中、无数据添加到Framelayout;因为加载成功的view是随时变化的,所以提供bindSuccessView()方法添加。
package com.ouyang.qqui.view; import android.content.Context; import android.util.AttributeSet; import android.view.View; import android.widget.Button; import android.widget.FrameLayout; import com.ouyang.qqui.R; public class StateLayout extends FrameLayout{ private View loadingView; private View errorView; private View successView; private View emptyView; public StateLayout(Context context) { this(context,null); } public StateLayout(Context context, AttributeSet attrs) { this(context, attrs,0); } public StateLayout(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); initView();//初始化View } /** * 添加那4个子View:加载中的,加载成功的,加载没有数据,加载失败的 */ private void initView() { //1.加载loadingView loadingView = View.inflate(getContext(), R.layout.progressbar_layout, null); addView(loadingView); //2.添加失败的View errorView = View.inflate(getContext(), R.layout.network404_layout, null); Button btn_reload = (Button) errorView.findViewById(R.id.click_again); btn_reload.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { //1.先显示loadingView showLoadingView(); //2.点击的时候再一次重新加载数据 if(listener!=null){ listener.onReload(); } } }); addView(errorView); //3.添加空白的view emptyView = View.inflate(getContext(), R.layout.empty_view, null); addView(emptyView); //4.加载成功的View在各界面是不同的,所以提供一个方法bindsucessview动态添加 //一开始隐藏所有的View hideAll(); } /** * 添加一个成功的View进来 */ public void bindSuccessView(View view){ successView = view; if(successView!=null){ successView.setVisibility(View.INVISIBLE);//隐藏successView //将它添加进来 addView(successView); } } public void showSuccessView(){ //先隐藏其他的 hideAll(); if(successView!=null){ successView.setVisibility(View.VISIBLE); } } public void showEmptyView(){ //先隐藏其他的 hideAll(); emptyView.setVisibility(View.VISIBLE); } public void showErrorView(){ //先隐藏其他的 hideAll(); errorView.setVisibility(View.VISIBLE); } public void showLoadingView(){ //先隐藏其他的 hideAll(); loadingView.setVisibility(View.VISIBLE); } /** * 隐藏所有的View */ public void hideAll(){ //设置各界面不可见,同时让他们不重新layout,要用的时候直接show就行了 loadingView.setVisibility(View.INVISIBLE); errorView.setVisibility(View.INVISIBLE); emptyView.setVisibility(View.INVISIBLE); if(successView!=null){ successView.setVisibility(View.INVISIBLE); } } private OnReloadListener listener; public void setOnReloadListener(OnReloadListener listener){ this.listener = listener; } public interface OnReloadListener{ /** * 当重新加载的按钮被点击的时候调用 */ void onReload(); } }2.在界面中使用...因为切换各界面的时候,ToolBar是不变的,所以new一个垂直的LinearLayout上面放ToolBar,下面放我们自定义的FrameLayout用来切换界面。
package com.ouyang.qqui.activity; import android.os.Bundle; import android.support.annotation.Nullable; import android.support.v4.widget.SwipeRefreshLayout; import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.DefaultItemAnimator; import android.support.v7.widget.DividerItemDecoration; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.text.TextUtils; import android.view.View; import android.widget.LinearLayout; import com.ouyang.qqui.R; import com.ouyang.qqui.adapter.AddFootViewAdapter; import com.ouyang.qqui.adapter.MyRecycleradapter; import com.ouyang.qqui.adapter.ViewHolder; import com.ouyang.qqui.bean.UnReceiveListBean; import com.ouyang.qqui.net.BaseCallback; import com.ouyang.qqui.net.ConnectionUrl; import com.ouyang.qqui.net.HttpUtils; import com.ouyang.qqui.view.StateLayout; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import butterknife.Bind; import butterknife.ButterKnife; /** * Create by oy 2017/6/15 13:50. */ public class ShowActivity extends AppCompatActivity { private StateLayout stateLayout; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); initView();//初始化界面 initData();//初始化数据 } private void initView() { //为了增加ToolBar新建一个垂直的线性布局 LinearLayout lin = new LinearLayout(this); lin.setOrientation(LinearLayout.VERTICAL); //将ToolBar添加在上面 lin.addView(View.inflate(this, R.layout.activity_toolbar,null)); //将我们的各种界面添加在下面 stateLayout = new StateLayout(this); lin.addView(stateLayout); //添加一个加载成功的view stateLayout.bindSuccessView(getsuccessView()); //绑定线性布局 setContentView(lin); ButterKnife.bind(this); //首先展示正在加载的view stateLayout.showLoadingView(); } public View getsuccessView() { View successView = View.inflate(this, R.layout.activity_rec, null); return successView; } private void initData() { //初始化数据,请求网络,按照你的框架来,这里只做展示用 String url = "哇哈哈哈"; HttpUtils.getInstance().get(url, new BaseCallback<String>() { @Override public void onFailure(int requstcode, Exception e) { //加载失败展示错误的view stateLayout.showErrorView(); } @Override public void onSuccess(String data) { if (TextUtils.isEmpty(data)){ //如果返回的数据为空,展示空界面 stateLayout.showEmptyView(); }else { //如果数据不为空,展示成功的view stateLayout.showSuccessView(); //继续噼里啪啦一大堆你的操作 // ... } } }); } }3.Toolbar布局
<?xml version="1.0" encoding="utf-8"?> <android.support.v7.widget.Toolbar xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="?actionBarSize" android:background="@color/blue" > <TextView android:layout_width="match_parent" android:layout_height="match_parent" android:text="Toolbar" android:textSize="18sp" android:gravity="center"/> </android.support.v7.widget.Toolbar>4.其实还是觉得有点繁琐,暂时就先这样吧。这个StateLayout是我改编自不知道哪个哥们的,侵权立删。
相关文章推荐
- 动手写一个Android数据加载时界面状态切换的开源库
- android:Activity中切换不同状态页:加载中,加载失败,数据页,空页面……
- Android数据加载界面状态切换:加载中样式,空数据样式,错误时样式
- Android中横竖屏切换加载不同布局导致fragment数据丢失的问题
- 【Android游戏开发之五】游戏注册界面Demo-实现两个Activity之间的切换与数据交互!
- 【Android游戏开发之五】游戏注册界面Demo-实现两个Activity之间的切换与数据交互!
- android脚步---不同界面之间切换
- (Android实战)ProgressBar+AsyncTask实现界面数据异步加载(含效果图)
- Android(java)学习笔记221:开发一个多界面的应用程序之不同界面间互相传递数据(短信助手案例)
- 【Android游戏开发之五】游戏注册界面Demo-实现两个Activity之间的切换与数据交互!
- android异步任务加载数据界面实现
- 【Android游戏开发之五】游戏注册界面Demo-实现两个Activity之间的切换与数据交互!
- 【Android游戏开发之五】游戏注册界面Demo-实现两个Activity之间的切换与数据交互!
- 【Android】解决RadioButton+FragmentPagerAdapter+Fragment切换页面数据加载的问题
- Android(java)学习笔记222:开发一个多界面的应用程序之不同界面间互相传递数据(短信助手案例的优化:请求码和结果码)
- Android中异步加载数据(二)AsyncTask异步更新界面
- Android 一个按钮两次单击触发两个不同事件并实现两个View在同一界面切换
- Android开发——不同Activity之间的切换和数据传输
- Android游戏开发5:游戏登录界面Demo(Activity间的切换和数据交互)
- 【Android游戏开发之五】游戏注册界面Demo-实现两个Activity之间的切换与数据交互!