안드로이드 통일된 네트워크 ui 디스플레이 클래스, 통일된 네트워크 관리 클래스

8318 단어 Android
최근 프로젝트 중 많은 부분에서 불러오는 중, 네트워크 오류, 그리고 다시 불러오는 기능이 필요합니다. 그래서 이렇게 통일된 관리 컨트롤을 고맙게 생각합니다. 편리하고 간단하며, 각종activity,fragment 및 기타 하위 페이지에 응용할 수 있습니다.
잔말 말고 코드로 바로 올라가세요.


import android.content.Context;
import android.net.Uri;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.FrameLayout;
import android.widget.LinearLayout;
import android.widget.TextView;



/**
 * Created by chenxiaoli on 2017/3/18 0018.
 *          
 *               
 *     activity,fragment,        
 */

public class MyFramelayout extends FrameLayout {
    private View successView;
    private View loadingView;
    private TextView emptyView;
    private View errorView;
    private OnReloadingListener listener;

    public void setOnReloadingListener(OnReloadingListener listener) {
        this.listener = listener;
    }

    public interface OnReloadingListener {
        void onReloading();
    }

    public MyFramelayout(Context context, View loadingView, TextView emptyView, View errorView) {
        super(context);
        initView(context, loadingView, emptyView, errorView);
    }

    public MyFramelayout(Context context, AttributeSet attrs) {
        super(context, attrs);
        initView(context);
    }

    public MyFramelayout(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        initView(context);
    }
    /**
     *        
     * @param context
     * @return
     */

    public boolean isNetworkConnected(Context context) {
        if (context != null) {
            ConnectivityManager mConnectivityManager = (ConnectivityManager) context
                    .getSystemService(Context.CONNECTIVITY_SERVICE);
            NetworkInfo mNetworkInfo = mConnectivityManager.getActiveNetworkInfo();
            if (mNetworkInfo != null) {
                return mNetworkInfo.isAvailable();
            }
        }
        return false;
    }


    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        if (successView == null && getChildCount() > 3) {
            successView = getChildAt(3);
            successView.setVisibility(INVISIBLE);
            if (getChildCount() > 4) {
                throw new RuntimeException("MyFramelayout XML          View");
            }
        }

        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    }

    private void initView(Context context) {
        loadingView = LayoutInflater.from(context).inflate(R.layout.item_loading, this, false);
        emptyView = (TextView) LayoutInflater.from(context).inflate(R.layout.item_load_empty, this, false);
        errorView = LayoutInflater.from(context).inflate(R.layout.item_load_error, this, false);
        errorView.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                if (listener != null) {
                    listener.onReloading();
                }
                onLoading();
            }
        });
        addView(loadingView);
        addView(emptyView);
        addView(errorView);
       if(isNetworkConnected(context)){
            onError();
              Toast.makeText(context,"       ",Toast.LENGTH_SHORT).show();
        }else {
            onLoading();
        }
    }
    

    private void initView(Context context, View loadingView, TextView emptyView, View errorView) {
        this.loadingView =loadingView;
        this.emptyView = emptyView;
        this.errorView = errorView;
        errorView.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                if (listener != null) {
                    listener.onReloading();
                }
                onLoading();
            }
        });
        addView(loadingView);
        addView(emptyView);
        addView(errorView);
        onLoading();
    }

    public void setLoadingView(View loadingView) {
        this.loadingView = (LinearLayout) loadingView;
        removeViewAt(0);
        addView(loadingView, 0);
    }

    public void setEmptyView(TextView emptyView) {
        this.emptyView = emptyView;
        removeViewAt(1);
        addView(emptyView, 1);
    }

    public void setErrorView(View errorView) {
        this.errorView = errorView;
        errorView.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                if (listener != null) {
                    listener.onReloading();
                }
                onLoading();
            }
        });
        removeViewAt(2);
        addView(errorView, 2);
    }


    public void onLoading() {
        if (successView != null) {
            successView.setVisibility(INVISIBLE);
        }
        loadingView.setVisibility(VISIBLE);
        emptyView.setVisibility(INVISIBLE);
        errorView.setVisibility(INVISIBLE);
    }

    public void onError() {
        if (successView != null) {
            successView.setVisibility(INVISIBLE);
        }
        loadingView.setVisibility(INVISIBLE);
        emptyView.setVisibility(INVISIBLE);
        errorView.setVisibility(VISIBLE);
    }

    public void onSuccess() {
        if (successView != null) {
            successView.setVisibility(VISIBLE);
        }
        loadingView.setVisibility(INVISIBLE);
        emptyView.setVisibility(INVISIBLE);
        errorView.setVisibility(INVISIBLE);
    }

    public void onEmpty(String msg) {
        if (successView != null) {
            successView.setVisibility(INVISIBLE);
        }
        loadingView.setVisibility(INVISIBLE);
        emptyView.setVisibility(VISIBLE);
        emptyView.setText(msg);
        errorView.setVisibility(INVISIBLE);
    }

}

그리고 대응하는 xml 파일
item_loading


item_load_error


item_load_empty


너도 자신의 세 가지 피드 컨트롤을 정의할 수 있어 매우 유연하다
그리고 acitiviy에서 어떻게 사용하는지
package com.ftoul.myapplication.activitys;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;

import com.xxx.myapplication.ui.MyFramelayout;
import com.zhy.http.okhttp.OkHttpUtils;
import com.zhy.http.okhttp.callback.Callback;

import okhttp3.Call;
import okhttp3.Response;

public class DemoActivity extends AppCompatActivity {


    private MyFramelayout myFramelayout;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_demo);
        myFramelayout = (MyFramelayout) findViewById(R.id.myframelayout);
        myFramelayout.setOnReloadingListener(new MyFramelayout.OnReloadingListener() {
            @Override
            public void onReloading() {
                getData();
            }
        });
        getData();
    }

    /**
     *        
     */
    private void getData(){
        String datas = "";//     json  
        //       OkHttp   
        OkHttpUtils
                .postString()
                .tag(this)
                .url(MyURL.APP_SERVICE)//     
                .content(datas)
                .build()
                .execute(new Callback() {//        
                    @Override
                    public Object parseNetworkResponse(Response response, int id) throws Exception {//     
                        myFramelayout.onSuccess();
                        //      
                        if(    ){
                            myFramelayout.onEmpty("    ");
                        }
                        return null;
                    }

                    @Override
                    public void onError(Call call, Exception e, int id) {//     
                        myFramelayout.onError();
                    }

                    @Override
                    public void onResponse(Object response, int id) {

                    }
                });
        
    }
}

대응하는 xml 파일은 다음과 같습니다


이상

좋은 웹페이지 즐겨찾기