在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 問答/C  Android/ 用的是RxJava,請教一個關于加載進度用dialog的問題

用的是RxJava,請教一個關于加載進度用dialog的問題

我是直接把dialog顯示放在onSubscribe中,然后在onComplete或onError隱藏.但是我這樣寫不管哪一個界面dialog界面都是占滿全屏,如何能夠只讓它顯示在某個指定區(qū)域,如圖是一個主界面,下面是四個切換按鈕,想把dialog顯示在紅色區(qū)域內.
圖片描述

public abstract class HttpCallback<T> implements Observer<BaseResponse<T>> {
    public static final String TAG = HttpCallback.class.getCanonicalName();

    private WeakReference<Activity> mActivity;

    private boolean mShow;
    private boolean mCancelable = false;

    private boolean hasError = true;
    private AlertDialog mDialog;

    public HttpCallback(Activity activity) {
        mActivity = new WeakReference<>(activity);
    }

    @Override
    public void onSubscribe(Disposable d) {
        if (mShow) {
            showDialog();//默認不顯示進度,需要顯示重寫onSubscribe方法,并showProgress為true
            Log.d(TAG, "onSubscribe: 1103顯示進度圈");
        }else{
            Log.d(TAG, "onSubscribe: 1103不顯示進度圈");
        }
    }

    @Override
    public void onNext(BaseResponse<T> t) {
        int code = t.getCode();  // 0 失敗,  1 成功 ,  -1 token過期跳轉到登錄界面
//        int code=-1;
        if (code == RequestUrl.CODE_SUCCESS) {
            hasError = false;
            onSuccess(t.getData(), t.getMsg());
        } else if (code == RequestUrl.CODE_TOKEN_EXPIRE) {
            toLogin();//token失效,跳轉到登錄界面
        } else {
            ToastUtils.showMessage(t.getMsg());
            onFailure();
        }
    }

    @Override
    public void onError(Throwable e) {
        if (mDialog != null)
            mDialog.dismiss();
        if (e instanceof SocketTimeoutException) {
            // 連接超時
            onError(e, ErrorStatus.HTTP_TIMEOUT);
        } else if (e instanceof ConnectException || e instanceof UnknownHostException) {
            // 無網(wǎng)絡
            onError(e, ErrorStatus.HTTP_UNCONNECTED);
        } else if (e instanceof HttpException) {
            // 網(wǎng)絡異常
//            onError(e, ErrorStatus.HTTP_EXCEPTION.setErrorCode(((HttpException) e).code()));
            onError(e, ErrorStatus.HTTP_EXCEPTION);
        } else if (e instanceof JsonSyntaxException || e instanceof JSONException) {
            // 數(shù)據(jù)異常
            onError(e, ErrorStatus.DATA_EXCEPTION);
        } else {
            // 其他錯誤
            onError(e, ErrorStatus.OTHER_EXCEPTION);
        }
        onFinish(hasError);
    }

    private void onError(Throwable e, final ErrorStatus otherException) {
        if (e != null) {
            e.printStackTrace();
        }

        mActivity.get().runOnUiThread(new Runnable() {
            @Override
            public void run() {
                ToastUtils.showMessage(otherException.getErrorMessage(), Toast.LENGTH_SHORT);
            }
        });
    }

    @Override
    public void onComplete() {
        if (mDialog != null)
            mDialog.dismiss();
        onFinish(hasError);
    }

    public abstract void onSuccess(T t, String msg);

    //除了成功與token失效的情況走這里
    public void onFailure() {

    }

    //token失效
    public void onTokenExpired() {

    }

    public void onFinish(boolean hasError) {
    }

    protected void showProgress(boolean show) {
        mShow = show;
    }

    public void setCancelable(boolean cancelable) {
        mCancelable = cancelable;
    }
    
    private void showDialog() {
        mDialog = new AlertDialog.Builder(mActivity.get()).create();
        mDialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
        mDialog.setCancelable(false);
        mDialog.show();
        Window window = mDialog.getWindow();
        window.getDecorView().setPadding(0, 0, 0, 0);
        window.setGravity(Gravity.CENTER);
        window.setContentView(R.layout.loading);
        WindowManager.LayoutParams lp = window.getAttributes();
        lp.width = WindowManager.LayoutParams.FILL_PARENT;
        lp.height = WindowManager.LayoutParams.FILL_PARENT;
        window.setAttributes(lp);
    }

    private void toLogin() {
//        ToastUtils.showLongMessage("登錄狀態(tài)已過期,請重新登錄");
        AlertDialog.Builder builder = new AlertDialog.Builder(mActivity.get());
        builder.setTitle("溫馨提示")
                .setMessage("登錄狀態(tài)已過期,請重新登錄")
                .setCancelable(false)
                .setPositiveButton("確定", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        UserManager.getInstance().logout();//清除保存數(shù)據(jù)
                        Intent loginIntent = new Intent(mActivity.get(), ThirdLoginActivity.class);//token失效,跳轉到登錄界面
                        loginIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
//            loginIntent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
                        mActivity.get().startActivity(loginIntent);
                    }
                }).show();
    }
}
回答
編輯回答
清夢

這個看上去和RxJava沒關系。應該只需要自定義一個dialog,設置好對應的位置以及大小就可以了?;蛘卟挥胐ialog,用View去模擬dialog的行為也可以。
有關自定義dialog,請百度。

2018年8月1日 13:29