Fragment根据网络返回状态显示不用界面

来源:互联网 发布:web服务器 软件 编辑:程序博客网 时间:2024/06/03 23:01
public abstract class BaseFragment extends Fragment {
protected final int STATUS_LOADING = 0;// 正在加载的状态
protected final int STATUS_UNKNOWN = 4;// 位置的状态


// 服务器返回的三种状态
protected final int STATUS_ERROR = 1;// 加载错误的状态
protected final int STATUS_EMPTY = 2;// 加载为空的状态
       protected final int STATUS_SUCCESS = 3;// 加载成功的状态


private int state = STATUS_LOADING;// 进来默认正在加载
@Override
public void onDestroyView() {
super.onDestroyView();
// 一个view 不能 有多个父view
// frameLayout从 父view中移除
ViewUtils.removeFromParent(frameLayout);
}


@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
if (frameLayout == null) {
// 创建帧布局
frameLayout = new FrameLayout(getActivity());
init();// 将几种不同的 界面添加到FrameLayout中
}
showPage();// 根据不同的状态切换界面
// show();// 根据服务器返回的结果 切换界面
return frameLayout;
}


private View loadingView;// 正在加载中的view对象
private View errorView;// 加载失败的view对象
private View emptyView;// 加载为空的view对象
private View successView;// 加载成功的view对象
private FrameLayout frameLayout;


/**
* 将几种不同的 界面添加到FrameLayout中
*/
protected void init() {
if (loadingView == null) {
loadingView = createLoadingView(); // 创建加载中的界面
frameLayout.addView(loadingView, new LayoutParams(
LayoutParams.MATCH_PARENT, -1));
}


if (errorView == null) {
errorView = createErrorView(); // 创建加载失败的view对象
frameLayout.addView(errorView, new LayoutParams(
LayoutParams.MATCH_PARENT, -1));
}
if (emptyView == null) {
emptyView = createEmptyView();// 创建加载为空的界面
frameLayout.addView(emptyView, new LayoutParams(
LayoutParams.MATCH_PARENT, -1));
}
}


/**
* 创建加载中的界面

* @return
*/
private View createLoadingView() {
// xml --- view
return UIUtils.inflate(R.layout.page_loading);
}


/**
* 创建加载失败的界面

* @return
*/
private View createErrorView() {
View view = UIUtils.inflate(R.layout.page_error);
view.findViewById(R.id.page_bt).setOnClickListener(
new OnClickListener() {


@Override
public void onClick(View v) {
// 点击后重新请求网络
show();
}
});
return view;
}


/**
* 创建加载为空的界面

* @return
*/
private View createEmptyView() {
return UIUtils.inflate(R.layout.page_empty);
}


/**
* / 根据不同的状态切换界面
*/
protected void showPage() {
// private View loadingView;// 正在加载中的view对象
// private View errorView;// 加载失败的view对象
// private View emptyView;// 加载为空的view对象
// private View successView;// 加载成功的view对象
// 在状态为 正在加载/未知 显示
if (loadingView != null) {
loadingView.setVisibility(state == STATUS_LOADING
|| state == STATUS_UNKNOWN ? View.VISIBLE : View.INVISIBLE);
}
// 状态为 错误 显示错误界面
if (errorView != null) {
errorView.setVisibility(state == STATUS_ERROR ? View.VISIBLE
: View.INVISIBLE);
}
// 获取服务器数据 但是数据为空 显示为空界面
if (emptyView != null) {
emptyView.setVisibility(state == STATUS_EMPTY ? View.VISIBLE
: View.INVISIBLE);
}
if (state == STATUS_SUCCESS) { // 只有状态为success 的时候才去创建成功界面
if (successView == null) {
successView = createSuccessView();
frameLayout.addView(successView, new LayoutParams(-1, -1));
}else {
successView.setVisibility(View.VISIBLE);
}
}else{
if (successView != null) {
successView.setVisibility(View.INVISIBLE);
}
}


}




/**
* 根据服务器返回的结果 切换界面
*/
public void show() {


// 上一个状态是错误状态 重新修改为正在加载
if (state == STATUS_ERROR) {
state = STATUS_LOADING;
}


// 状态改变后重新显示界面
showPage();
ThreadUtils.runOnBackThread(new Runnable() {


@Override
public void run() {
SystemClock.sleep(3000);
state = load();
ThreadUtils.runOnUiThread(new Runnable() {


@Override
public void run() {
showPage();// 根据不同的状态切换不同的界面
}
});
}
});
}


/**
* 创建加载成功界面

* @return
*/
protected abstract View createSuccessView() ;


/**
* 访问网络 ./访问服务器 返回对应的状态 protected final int STATUS_ERROR = 1;// 加载错误的状态
* protected final int STATUS_EMPTY = 2;// 加载为空的状态 protected final int
* STATUS_SUCCESS = 3;// 加载成功的状态

* @return
*/
protected abstract  int load() ;

}

public class ThreadUtils {


/**
* 子线程执行
* @param r
*/
public static void runOnBackThread(Runnable r){
new Thread(r).start();
}

private static Handler handler = new Handler();
/**
* 在主线程执行
* @param r
*/
public static void runOnUiThread(Runnable r){
handler.post(r);
}
}

public class ViewUtils {


/**
* 将当前view 从父view中移除
* @param view
*/
public static void removeFromParent(View view){
if (view != null) {
ViewParent parent = view.getParent();
if (parent != null && parent instanceof ViewGroup) {
ViewGroup group = (ViewGroup) parent;
group.removeView(view);
}
}
}
}


阅读全文
0 0
原创粉丝点击