一:抽象活动基类,抽取公共方法+MVP基类

2020-08-05  本文已影响0人  我家猫猫不睡觉
public abstract class AbstractActivity extends AppCompatActivity {

// 解决 rxjava 请求内存泄漏问题
    protected CompositeDisposable mCompositeDisposable;

    protected ImageView backImg;
    protected TextView title;
    protected LoadingPage loading;

    /**
     * 获取布局id
     *
     * @return 布局id
     */
    protected abstract int getLayout();

    /**
     * 初始化布局
     */
    protected abstract void initView();

    /**
     * 初始化点击事件监听器
     */
    protected abstract void initListener();

 /**
     * 初始化数据
     */
    protected abstract void initData();

    protected void initDisposable() {
        if (mCompositeDisposable == null) {
            mCompositeDisposable = new CompositeDisposable();
        }
    }

    public CompositeDisposable getCompositeDisposable() {
        initDisposable();
        return mCompositeDisposable;
    }

    public void setTitle(String titleTxt) {
        if (title != null && titleTxt != null) {
            title.setText(titleTxt);
        }
    }

    public void setTitle(int titleId) {
        if (title != null) {
            title.setText(titleId);
        }
    }

    @Override
    public void onBackPressed() {
        super.onBackPressed();
        AppManager.getAppManager().finishActivity();
    }

  //------------------------------隐藏键盘----------------------------
    @Override
    public boolean dispatchTouchEvent(MotionEvent ev) {
        if (ev.getAction() == MotionEvent.ACTION_DOWN) {
            if (this == null) {
                LogUtil.e("dispatchTouchEvent", "context == null");
                return false;
            }
            // 自动隐藏键盘
            View v = getCurrentFocus();
            if (isShouldHideInput(v, ev)) {
                InputMethodManager imm = (InputMethodManager)      
                   this.getApplicationContext().getSystemService(Context.INPUT_METHOD_SERVICE);
                if (imm != null) {
                    imm.hideSoftInputFromWindow(v.getWindowToken(), 0);
                }
            }
            return super.dispatchTouchEvent(ev);
        }
        // 必不可少,否则所有的组件都不会有TouchEvent了
        if (getWindow().superDispatchTouchEvent(ev)) {
            return true;
        }
        return onTouchEvent(ev);
    }

     private boolean isShouldHideInput(View v, MotionEvent event) {
        if (v != null && (v instanceof EditText)) {
            int[] leftTop = {0, 0};
            // 获取输入框当前的location位置
            v.getLocationInWindow(leftTop);
            int left = leftTop[0];
            int top = leftTop[1];
            int bottom = top + v.getHeight();
            int right = left + v.getWidth();
            float x = event.getX();
            float y = event.getY();
            if (x > left && x < right && y > top && y < bottom) {
                // 点击的是输入框区域,保留点击EditText的事件
                return false;
            } else {
                return true;
            }
        }
        // 如果焦点不是EditText则忽略,这个发生在视图刚绘制完,第一个焦点不在EditText上,和用户用轨迹球选择其他的焦点
        return false;
    }

     //此方法只是关闭软键盘
    protected void hintKbTwo() {
        if (this == null) return;
        InputMethodManager imm = (InputMethodManager)this.getApplicationContext().getSystemService(Context.INPUT_METHOD_SERVICE);
        if(imm.isActive()&&getCurrentFocus()!=null){
            if (getCurrentFocus().getWindowToken()!=null) {
                imm.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
            }
        }
    }

    protected Context getMyContext() {
        return this;
    }
}
public abstract class BaseMvpActivity<P extends IPresenter<V>, V extends IView> extends AbstractActivity {

    protected P mPresenter;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(getLayout());
        AppManager.getAppManager(this).addActivity(this);
        initView();
        mPresenter = initPreseter();
        initDisposable();
        attach();
        initListener();
        initData();
    }

    @Override
    protected void onResume() {
        initDisposable();
        super.onResume();
        attach();
    }

    private void attach() {
        if (mPresenter != null) {
            mPresenter.attach((V)this);
        }
    }

    protected abstract P initPreseter();

    @Override
    protected void onDestroy() {
        if(mPresenter != null) {
            mPresenter.dettach();
        }
        super.onDestroy();
    }
}
/**
 * 抽取fragment 的 mvp 模式基类, 使用mvp是为了让 view 层跟 model 层充分解耦,便于维护与单元测试
 * 懒加载
 * * @param <P> presenter
 * @param <V> view
 */
public abstract class BaseMvpLazyFragment<P extends IPresenter<V>, V extends IView> extends AbstractFragment {

    protected boolean isFirst;

    protected P mPresenter;

    /**
     * 初始化presenter
     */
    protected abstract P initPreseter();

    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        if (mView == null) {
            mView = inflater.inflate(getLayout(), container, false);
        }
        initView();
        initPreseter();
        attach();
        initListener();
        LogUtil.w(TAG, "onCreateView()");
        return mView;
    }

    @Override
    public void onResume() {
        super.onResume();
        LogUtil.w(TAG, "onResume() 是否第一次加载 " + !isFirst);
        attach();
        // 是否首次加载该页面
        if(!isFirst) {
            isFirst = true;
            initData();
        }
    }

    /**
     * 绑定view
     */
    private void attach() {
        if (mPresenter != null) {
            mPresenter.attach((V)this);
        }
    }

    @Override
    public void onDetach() {
        if(mPresenter != null) {
            mPresenter.dettach();
        }
        isFirst = false;
        super.onDetach();
        LogUtil.w(TAG, "onDetach()");
    }
}

Android Retrofit2.0使用详解
https://blog.csdn.net/qq_35229022/article/details/93849660

RxJava入门
https://www.jianshu.com/p/a406b94f3188

上一篇 下一篇

猜你喜欢

热点阅读