Androidページ異常表示の簡易パッケージ


サマリ
一般的には、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);