Androidページ異常表示の簡易パッケージ
8821 ワード
サマリ
一般的には、1ページに入るとネットワークが要求され、要求ネットワークには様々な異常があります.例えば、戻りデータが空、サーバ異常、パラメータエラーなどです.では、ページはこれらの戻り結果を得た後、ユーザーに表示するためのフィードバックが必要です.すべての異常をToastで表示することはできません.だから、インタフェースはあります.では、インタフェースはどこに表示されますか?一般的に1つのページにタイトルバーがあり、タイトルバーの下に内容があり、それから下のバーもあります.タイトルバーと下のバーはいつも異常なインタフェースに隠されてはいけないので、異常を示す場所は、ページの本文部分でなければなりません.しかし、本文の部分は階層化されている可能性もあります.例えば、本文の上の部分は情報展示で、下はデータリストで、情報展示はネットワークにアクセスしませんが、リストにはデータ異常が発生する可能性があります.そうすれば、異常インタフェースで情報展示の部分も隠すことはできませんよね?他のコンポーネントを隠すことなく、必要な場所で異常インタフェースを表示できる非常に柔軟な異常表示クラスが必要です.
実現構想.
構想はこうです.自分で異常展示の場所として領域を定義し、この領域のルートレイアウトを見つけて、異常レイアウトでこのレイアウトを置き換えることでいいです.
例えばこの
IDが
コード#コード#
使用
作ったのはできたが、どうやって使うのか.例えばBaseActivityにカプセル化します
そして使用時に、彼を引き継いでshowResultメソッドを呼び出せばいいです.
一般的には、1ページに入るとネットワークが要求され、要求ネットワークには様々な異常があります.例えば、戻りデータが空、サーバ異常、パラメータエラーなどです.では、ページはこれらの戻り結果を得た後、ユーザーに表示するためのフィードバックが必要です.すべての異常をToastで表示することはできません.だから、インタフェースはあります.では、インタフェースはどこに表示されますか?一般的に1つのページにタイトルバーがあり、タイトルバーの下に内容があり、それから下のバーもあります.タイトルバーと下のバーはいつも異常なインタフェースに隠されてはいけないので、異常を示す場所は、ページの本文部分でなければなりません.しかし、本文の部分は階層化されている可能性もあります.例えば、本文の上の部分は情報展示で、下はデータリストで、情報展示はネットワークにアクセスしませんが、リストにはデータ異常が発生する可能性があります.そうすれば、異常インタフェースで情報展示の部分も隠すことはできませんよね?他のコンポーネントを隠すことなく、必要な場所で異常インタフェースを表示できる非常に柔軟な異常表示クラスが必要です.
実現構想.
構想はこうです.自分で異常展示の場所として領域を定義し、この領域のルートレイアウトを見つけて、異常レイアウトでこのレイアウトを置き換えることでいいです.
例えばこの
layout_record.xml
:
IDが
ll_content
のLinearLayoutの中にはページの内容があります.つまり、RecyclerViewです.データのロードが異常であれば、RecyclerViewの親レイアウトll_content
を見つけて、RecyclerViewを隠したり削除したりして、ll_contentは自分で定義したエラーレイアウトを追加し、対応するエラー情報を表示すれば、効果が得られます.簡単に言えば、データを表示すべきRecyclerViewを、誤ったレイアウトに置き換えることです.tipsViewコード#コード#
public class BaseViewHelper implements View.OnClickListener {
private FrameLayout mContentLayout;
private View mTargetView;
private FrameLayout mTargetLayout ;
// ,
private ImageView mIcon;
private TextView mTips;
private LayoutInflater mInflater;
View tipsView ;
View loadingView ;
View targetView ;
private Context mContext ;
public BaseViewHelper(Context context, int layoutResID) {
initView(context, layoutResID, null);
}
public BaseViewHelper(Context context, View view) {
initView(context, 0, view);
}
private void initView(Context context, int layoutResID, View view) {
mContext = context ;
FrameLayout.LayoutParams layoutParam = new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
this.mInflater = LayoutInflater.from(context);
mTargetLayout = new FrameLayout(context);
if (layoutResID != 0) {
this.mTargetView = mInflater.inflate(layoutResID, null);
} else {
this.mTargetView = view;
}
// target Layout
mTargetLayout.addView(mTargetView);
//
mContentLayout = new FrameLayout(context);
mContentLayout.addView(mTargetLayout);
//
tipsView = mInflater.inflate(R.layout.base_tips_layout, null);
tipsView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mOnReloadingListener.onReloading();
}
});
tipsView.setLayoutParams(layoutParam);
tipsView.setId(R.id.view_tips);
loadingView = mInflater.inflate(R.layout.layout_loading_view,null);
loadingView.setId(R.id.loading_view);
mIcon = (ImageView) tipsView.findViewById(R.id.id_base_icon);
mTips = (TextView) tipsView.findViewById(R.id.id_base_tips);
}
/**
* , ,
*/
public void showLoadingView() {
hiedErrorView();
if (((Activity)mContext).findViewById(R.id.loading_view) == null) {
ViewGroup.LayoutParams params = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
((Activity) mContext).addContentView(loadingView, params);
}
loadingView.setVisibility(View.VISIBLE);
}
/**
* (tipsView)
* @param target , RecyclerView , RecyclerView
* @param status ,
*/
public void showResultView(View target, int status) {
//
TErrorCode errorCode = TErrorCode.getInstance();
showResultView(target,status,errorCode.initErrors());
}
/**
* (tipsView)
* @param target , RecyclerView , RecyclerView
* @param status ,
* @param msgs , “ XX XX”, “ XX”,
*/
public void showResultView(View target, int status, Map msgs) {
//
hiedLoadingView();
//customErrorMsg(msgs) , , , ,
//
TErrorCode errorCode = TErrorCode.customErrorMsg(msgs) ;
if (targetView == null) {
targetView = target;
targetView.setId(R.id.target_view);
}
// target
ViewGroup parent = (ViewGroup) target.getParent();
View tempTips = parent.findViewById(R.id.view_tips) ;
if (tempTips == null) {
// tipsView,
parent.addView(tipsView);
} else {
tipsView.setVisibility(View.VISIBLE);
}
//TErrorCode.NULL_RESULTS ,int
mIcon.setBackgroundResource(status == TErrorCode.NULL_RESULTS ?R.mipmap.ico_no_content:R.mipmap.ico_no_network);
//getErrorMsg(status,errorCode) status ,
mTips.setText(TErrorCode.getErrorMsg(status,errorCode));
// , RecyclerView, RecyclerView ,tipsView
target.setVisibility(View.GONE);
// token
if (status == TErrorCode.TOKEN_OUT_OF_DATE) {
ToolUtil.loginout((Activity) mContext,"token , !");
}
//
else if (status == TErrorCode.APP_VERSION_ERROR){
ToolUtil.update((Activity) mContext);
}
}
/**
*
*/
public void hiedLoadingView() {
if (((Activity)mContext).findViewById(R.id.loading_view) != null) {
((Activity) mContext).findViewById(R.id.loading_view).setVisibility(View.GONE);
}
hiedErrorView();
}
/**
* tipsView
*/
public void hiedErrorView() {
if (((Activity)mContext).findViewById(R.id.view_tips) != null) {
((Activity) mContext).findViewById(R.id.view_tips).setVisibility(View.GONE);
}
if (((Activity)mContext).findViewById(R.id.target_view) != null) {
((Activity) mContext).findViewById(R.id.target_view).setVisibility(View.VISIBLE);
}
}
public FrameLayout getContentLayout() {
return mContentLayout;
}
public View getTargetView() {
return mTargetView;
}
@Override
public void onClick(View v) {
if (mOnReloadingListener != null) {
mOnReloadingListener.onReloading();
}
}
public interface OnReloadingListener {
void onReloading();
}
private OnReloadingListener mOnReloadingListener;
public void setOnReloadingListener(OnReloadingListener l) {
this.mOnReloadingListener = l;
}
}
使用
作ったのはできたが、どうやって使うのか.例えばBaseActivityにカプセル化します
public abstract class BaseActivity extends Activity implements BaseViewHelper.OnReloadingListener {
public BaseViewHelper mViewHelper;
@Override
public void setContentView(int layoutResID) {
mViewHelper = new BaseViewHelper(this, layoutResID);
this.setContentView(mViewHelper.getContentLayout());
init();
}
//
private void init(){
mViewHelper.setOnReloadingListener(this);
}
@Override
public void setContentView(View view) {
mViewHelper = new BaseViewHelper(this, view);
super.setContentView(mViewHelper.getContentLayout());
init();
}
public void showResultView(View target,int status) {
mViewHelper.showResultView(target, status);
}
public void showResultView(View target, int status, Map msgs) {
mViewHelper.showResultView(target, status,msgs);
}
public void showLoadingView() {
mViewHelper.showLoadingView();
}
@Override
public void onReloading() {
showLoadingView();
}
}
そして使用時に、彼を引き継いでshowResultメソッドを呼び出せばいいです.
Map msgs = new HashMap<>();
// “ ”
// “ ”
msgs.put(TErrorCode.NULL_RESULTS," ") ;
showResultView(llContent,error.getStatus(),msgs);