日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

Android fragment 页面,[38→100]一个常规的Android页面模型:NetFragment

發布時間:2023/12/15 Android 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Android fragment 页面,[38→100]一个常规的Android页面模型:NetFragment 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

問題場景

Android開發中大部分頁面都包含如下邏輯:

進入頁面,加載網絡數據,顯示加載頁面

加載完成后,有以下幾種情況:

正常返回,有有效數據,顯示“有效界面”

正常返回,有效數據為空,顯示“空數據界面”

正常返回,服務器判定輸入參數異常,顯示“參數異常界面”,比如“用戶登錄失效”等,直接跳轉相應的頁面

異常返回,網絡超時,無法訪問服務器等狀態,顯示“加載失敗頁面”

無法訪問網絡,顯示“無法訪問網絡界面”。

怎么解決呢?

原本想各個界面由NetFragment提供接口進行設置,后來考慮Android的界面基本xml繪制,透過id與代碼綁定。那不如采用“約定優于配置原則”,直接規定好那些id標識哪些界面,NetFragment里面根據相應的id去尋找界面即可。所以最后約定id名稱如下:

加載界面 R.id.net_progress

有效界面 R.id.net_result

空數據界面 R.id.net_no_result

參數異常界面 R.id.net_error

加載失敗頁面 R.id.net_fail

無法訪問網絡界面 R.id.net_cannot_access

基于SOLID原則中的S——單一責任原則(The Single Responsibility Principle),各個界面的點擊、觸摸都由各自處理,NetFragment只負責加載數據、控制各類界面顯示隱藏,至于下拉刷新、上拉加載下一頁數據等操作都不在此類里面內進行管理。

最后產生的代碼——NetFragment.java

package lib;

import android.os.Bundle;

import android.view.LayoutInflater;

import android.view.View;

import android.view.ViewGroup;

import com.freetek.deepsea.R;

import panda.android.lib.base.control.SimpleSafeTask;

import panda.android.lib.base.model.ListNetResultInfo;

import panda.android.lib.base.model.NetResultInfo;

import panda.android.lib.base.model.net.BaseRepositoryCollection;

import panda.android.lib.base.ui.fragment.BaseFragment;

import panda.android.lib.base.util.DevUtil;

import panda.android.lib.base.util.Log;

/**

* 加載網頁數據的通用模型,包含 進度條控制、結果顯示控制。

*

* @param

* @author shitianci

*/

public abstract class NetFragment extends BaseFragment {

private static final String TAG = NetFragment.class.getSimpleName();

protected View mViewProgress = null; //加載界面

protected View mViewResult = null; //有效界面

protected View mViewNoResult = null; //空數據界面

protected View mViewError = null; //參數異常界面

protected View mViewFail = null; //加載失敗頁面

protected View mViewCannotAccess = null; //無法訪問網絡

protected SimpleSafeTask netTask = null;

private View[] mViewArray;

private int[] mViewArrayID = new int[]{

R.id.net_progress, //加載界面

R.id.net_result, //有效界面

R.id.net_no_result, //空數據界面

R.id.net_error, //參數異常界面

R.id.net_fail, //加載失敗頁面

R.id.net_cannot_access}; //無法訪問網絡

//todo 這些數據需要放到xml里面進行管理

private String[] mViewToastString = new String[]{

"正在加載中", //加載界面

"加載到有效數據了", //有效界面

"加載數據為空", //空數據界面

"參數異常", //參數異常界面

"無法訪問服務器", //加載失敗頁面

"無法訪問網絡"}; //無法訪問網絡

@Override

public int getLayoutId() {

return R.layout.panda_fragment_net;

}

@Override

public View onCreateView(LayoutInflater inflater, ViewGroup container,

Bundle savedInstanceState) {

View createdView = super.onCreateView(inflater, container,

savedInstanceState);

mViewProgress = createdView.findViewById(R.id.net_progress);

mViewResult = createdView.findViewById(R.id.net_result);

mViewNoResult = createdView.findViewById(R.id.net_no_result);

mViewError = createdView.findViewById(R.id.net_error);

mViewFail = createdView.findViewById(R.id.net_fail);

mViewCannotAccess = createdView.findViewById(R.id.net_cannot_access);

mViewArray = new View[]{mViewProgress, mViewResult, mViewNoResult, mViewError, mViewFail, mViewCannotAccess};

return createdView;

}

@Override

public void onActivityCreated(Bundle savedInstanceState) {

super.onActivityCreated(savedInstanceState);

loadNetData(false);

}

boolean loadingNetData = false;

public void loadNetData() {

loadNetData(false);

}

public void loadNetData(final boolean useSecondModel) {

Log.d(TAG, "loadNetData, loadingNetData = " + loadingNetData);

if (loadingNetData) {

return;

}

if (!BaseRepositoryCollection.tryToDetectNetwork(getActivity())) {

showOnlyView(R.id.net_cannot_access, useSecondModel);

return;

}

netTask = new SimpleSafeTask(getActivity()) {

protected void onPreExecuteSafely() throws Exception {

loadingNetData = true;

showOnlyView(R.id.net_progress, useSecondModel);

onPreloadNetData(useSecondModel);

}

@Override

protected T doInBackgroundSafely() throws Exception {

T result = onDoInBackgroundSafely();

return result;

}

@Override

protected void onPostExecuteSafely(T result, Exception e) {

onPostloadNetData(useSecondModel);

super.onPostExecuteSafely(result, e);

loadingNetData = false;

if (e != null || result == null) {

showOnlyView(R.id.net_fail, useSecondModel);

return;

}

if (result.getRespCode() != NetResultInfo.RETURN_CODE_000000) {

showOnlyView(R.id.net_error, useSecondModel);

return;

}

if (result instanceof ListNetResultInfo && ((ListNetResultInfo) result).getList().size() == 0) {

showOnlyView(R.id.net_no_result, useSecondModel);

return;

}

showOnlyView(R.id.net_result, useSecondModel);

onDisplayResult(result);

}

protected void onCancelled() {

loadingNetData = false;

showOnlyView(R.id.net_fail, useSecondModel);

}

};

netTask.execute();

return;

}

/**

* -------------------------

* START: 最重要的流程方法

* -------------------------

*/

/**

* 開始加載網絡數據

* @param useSecondModel

*/

public void onPreloadNetData(boolean useSecondModel) {

}

/**

* 加載后臺數據

*

* @return

*/

protected abstract T onDoInBackgroundSafely();

/**

* 顯示后臺數據

*

* @param result

*/

protected abstract void onDisplayResult(T result);

/**

* 網絡數據加載結束

* @param useSecondModel

*/

public void onPostloadNetData(boolean useSecondModel) {

}

/**

* -------------------------

* END

* -------------------------

*/

/**

* -------------------------

* START: 純粹的界面展示控制,不推薦外部調用、重寫

* -------------------------

*/

/**

* 顯示指定的View,剩下的界面都隱藏。

*

* @param useSecondModel 是否啟用第二次模式,在加載第2……n次數據時,無需切換其它界面,采用Toast顯示信息即可。

*/

protected void showOnlyView(int viewId, boolean useSecondModel) {

int i = 0;

for (View v : mViewArray) {

i++;

if (v == null) {

continue;

} else if (v.getId() == viewId) {

Log.d(TAG, "showOnlyView, i = " + i);

if (useSecondModel && (viewId != R.id.net_progress || viewId != R.id.net_result)) {

DevUtil.showInfo(getActivity(), mViewToastString[i-1]);

} else {

v.setVisibility(View.VISIBLE);

}

} else {

v.setVisibility(View.GONE);

}

}

}

protected void showProgress() {

Log.d(TAG, "showProgress, mViewProgress = " + mViewProgress);

if (mViewProgress != null) {

mViewProgress.setVisibility(View.VISIBLE);

}

}

protected void hiddenProgress() {

Log.d(TAG, "hiddenProgress, mViewProgress = " + mViewProgress);

if (mViewProgress != null) {

mViewProgress.setVisibility(View.GONE);

}

}

// protected void showResult() {

// Log.d(TAG, "showResult");

// if (mViewResult != null) {

// mViewResult.setVisibility(View.VISIBLE);

// }

// }

//

// protected void hiddenResult() {

// Log.d(TAG, "hiddenResult");

// if (mViewResult != null) {

// mViewResult.setVisibility(View.GONE);

// }

// }

//

// protected void showNoResult() {

// Log.d(TAG, "showNoResult");

// if (mViewNoResult != null) {

// mViewNoResult.setVisibility(View.VISIBLE);

// }

// }

//

// protected void hiddenNoResult() {

// Log.d(TAG, "hiddenNoResult");

// if (mViewNoResult != null) {

// mViewNoResult.setVisibility(View.GONE);

// }

// }

//

// public void showError() {

// Log.d(TAG, "showNetErrResult");

// if (mViewError != null) {

// mViewError.setVisibility(View.VISIBLE);

// }

// }

//

// private void hiddenError() {

// if (mViewError != null) {

// mViewError.setVisibility(View.GONE);

// }

// }

//

// public void showFail() {

// Log.d(TAG, "showFail");

// if (mViewFail != null) {

// mViewFail.setVisibility(View.VISIBLE);

// }

// }

//

// public void hiddenFail() {

// Log.d(TAG, "hiddenFail");

// if (mViewFail != null) {

// mViewFail.setVisibility(View.GONE);

// }

// }

//

// public void showCannotAccess() {

// if (mViewCannotAccess != null) {

// mViewCannotAccess.setVisibility(View.VISIBLE);

// }

// }

//

// public void hiddenCannotAccess() {

// if (mViewCannotAccess != null) {

// mViewCannotAccess.setVisibility(View.GONE);

// }

// }

/**

* -------------------------

* END

* -------------------------

*/

}

后續拓展

可以從開發者使用角度考慮,內置一系列子類,達到各種場景中“One Step”集成的效果。比如默認效果為:

加載界面:彈出一個透明背景的加載框

有效界面:支持 下拉刷新、上拉加載下一頁

空數據界面:支持圖文格式

參數異常界面:采用Toast提示

加載失敗頁面:提醒用戶網速過慢,建議切換網絡

無法訪問網絡界面:提醒用戶打開網絡

Panda

2016-06-03

總結

以上是生活随笔為你收集整理的Android fragment 页面,[38→100]一个常规的Android页面模型:NetFragment的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。