feat: 优化Base类自动设置DataBinding,app拖动数据更加合理

This commit is contained in:
TongTongStudio committed 2026-06-14 20:22:16 +08:00
1 parent a59370cf32
commit 5b456a5bf0
49 files changed
+1173 -559

No files matched your search

@@ -1,35 +0,0 @@
package com.ttstd.dialer.base.mvp;
import android.os.Bundle;
import androidx.annotation.CallSuper;
import androidx.annotation.Nullable;
import com.ttstd.dialer.base.BaseTransparentActivity;
@Deprecated
public abstract class BaseMvpActivity extends BaseTransparentActivity {
public BaseMvpActivity() {
super();
}
@Override
@CallSuper
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(getLayoutId());
initView();
initData();
}
/**
* 初始化视图
*/
protected abstract void initView();
/**
* 初始化数据
*/
protected abstract void initData();
}
@@ -1,8 +0,0 @@
package com.ttstd.dialer.base.mvp;
@Deprecated
public interface BasePresenter<V extends BaseView> {
void attachView(V view);
void detachView();
}
@@ -1,6 +0,0 @@
package com.ttstd.dialer.base.mvp;
@Deprecated
public interface BaseView {
}
@@ -34,6 +34,12 @@ public abstract class BaseMvvmActivity<VM extends ViewModel, VDB extends ViewDat
Logger.e(TAG, "isLocalClass:" + vmClass.getSimpleName().equals(ViewModel.class.getSimpleName()) + " isAbstract:" + isAbstract);
if (!isAbstract) {//不是一个抽象类
mViewModel = new ViewModelProvider(this).get(vmClass);
if (mViewModel instanceof BaseViewModel) {
BaseViewModel<?, ?> baseVm = (BaseViewModel<?, ?>) mViewModel;
baseVm.setContext(this);
baseVm.setVDBinding(mViewDataBinding);
baseVm.setLifecycle(getLifecycleSubject());
}
}
initDataBinding();
initView();
@@ -1,14 +1,11 @@
package com.ttstd.dialer.base.mvvm.fragment;
import android.app.Activity;
import android.content.Context;
import android.content.res.Configuration;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.inputmethod.InputMethodManager;
import android.widget.EditText;
import androidx.annotation.LayoutRes;
import androidx.annotation.NonNull;
@@ -19,35 +16,26 @@ import androidx.lifecycle.ViewModel;
import androidx.lifecycle.ViewModelProvider;
import com.ttstd.dialer.base.BaseDialogFragment;
import com.ttstd.dialer.base.mvvm.BaseViewModel;
import com.ttstd.dialer.utils.Logger;
import java.lang.ref.WeakReference;
import java.lang.reflect.ParameterizedType;
/**
* 优化生命周期管理,去掉冗余的 Bundle 定义
* @param <VM> ViewModel 类型
* @param <VDB> ViewDataBinding 类型
*/
public abstract class BaseMvvmDialogFragment<VM extends ViewModel, VDB extends ViewDataBinding> extends BaseDialogFragment {
protected String mTag = this.getClass().getSimpleName();
/**
* 是否顯示了
*/
protected final String mTag = this.getClass().getSimpleName();
protected boolean mIsVisible;
/**
* 是否準備好了-Created
*/
protected boolean mHasPrepare;
protected VM mViewModel;
protected VDB mViewDataBinding;
protected Class<VM> vmClass;
protected Bundle bundle;
protected Bundle savedInstanceState;
// protected Context context;
/**
* 上下文
*/
private WeakReference<Context> ctx;
public Context getCtx() {
@@ -60,70 +48,73 @@ public abstract class BaseMvvmDialogFragment<VM extends ViewModel, VDB extends V
ctx = new WeakReference<>(context);
}
/**
* onCreate、onResume里不能调用
*
* @return
*/
public boolean isAttached() {
boolean flag = getCtx() != null && isAdded();
Logger.e(" >> isAttached >>", "flag = " + flag);
return flag;
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// ViewModel 初始化移至 onCreate
try {
Class<VM> vmClass = (Class<VM>) ((ParameterizedType) this.getClass().getGenericSuperclass()).getActualTypeArguments()[0];
mViewModel = new ViewModelProvider(this).get(vmClass);
if (mViewModel instanceof BaseViewModel) {
BaseViewModel<?, ?> baseVm = (BaseViewModel<?, ?>) mViewModel;
baseVm.setContext(getContext());
baseVm.setLifecycle(getLifecycleSubject());
}
} catch (Exception e) {
Logger.e(mTag, "ViewModel initialization failed: " + e.getMessage());
}
}
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
mViewDataBinding = DataBindingUtil.inflate(inflater, getLayoutId(), container, false);
try {
vmClass = (Class<VM>) ((ParameterizedType) this.getClass().getGenericSuperclass()).getActualTypeArguments()[0];
mViewModel = new ViewModelProvider(this).get(vmClass);
} catch (Exception e) {
Logger.e(mTag, "Failed to create ViewModel: " + e.getMessage());
throw new RuntimeException("Failed to create ViewModel", e);
if (mViewModel instanceof BaseViewModel) {
((BaseViewModel<?, ?>) mViewModel).setVDBinding(mViewDataBinding);
}
return mViewDataBinding.getRoot();
}
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
mViewDataBinding.setLifecycleOwner(getViewLifecycleOwner());
initDataBinding();
initView(bundle = getArguments());
initData(this.savedInstanceState = savedInstanceState);
initView(getArguments());
initData(savedInstanceState);
if (mIsVisible) {
mHasPrepare = true;
if (mIsVisible || getUserVisibleHint()) {
mIsVisible = true;
onEnter();
}
mHasPrepare = true;
}
@Override
public void onDestroyView() {
super.onDestroyView();
mHasPrepare = false;
// 及时解绑 Binding,防止内存泄漏
if (mViewModel instanceof BaseViewModel) {
((BaseViewModel<?, ?>) mViewModel).setVDBinding(null);
}
mViewDataBinding = null;
mViewModel = null;
}
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
if (mIsVisible == getUserVisibleHint())
return;
mIsVisible = getUserVisibleHint();
if (mIsVisible == isVisibleToUser) return;
mIsVisible = isVisibleToUser;
if (mIsVisible) {
if (!mHasPrepare)
return;
onEnter();
if (mHasPrepare) {
onEnter();
}
} else {
onExit();
if (mHasPrepare) {
onExit();
}
}
}
@@ -145,36 +136,13 @@ public abstract class BaseMvvmDialogFragment<VM extends ViewModel, VDB extends V
super.onConfigurationChanged(newConfig);
}
protected void hideInputMethod(Activity activity) {
if (activity == null) return;
InputMethodManager imm = (InputMethodManager) activity.getSystemService(Activity.INPUT_METHOD_SERVICE);
View view = activity.getCurrentFocus();
if (view != null) {
imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
}
}
protected void hideInputMethod(Activity activity, EditText editText) {
if (activity == null || editText == null) return;
InputMethodManager imm = (InputMethodManager) editText.getContext().getSystemService(Activity.INPUT_METHOD_SERVICE);
View view = activity.getCurrentFocus();
if (view != null) {
imm.hideSoftInputFromWindow(view.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
}
}
protected void showInputMethod(EditText editText) {
if (editText == null) return;
InputMethodManager imm = (InputMethodManager) editText.getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
imm.showSoftInput(editText, InputMethodManager.SHOW_FORCED);
}
protected void onEnter() {
}
protected void onExit() {
}
public boolean isAttached() {
return getCtx() != null && isAdded();
}
}
@@ -1,14 +1,11 @@
package com.ttstd.dialer.base.mvvm.fragment;
import android.app.Activity;
import android.content.Context;
import android.content.res.Configuration;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.inputmethod.InputMethodManager;
import android.widget.EditText;
import androidx.annotation.LayoutRes;
import androidx.annotation.NonNull;
@@ -19,42 +16,32 @@ import androidx.lifecycle.ViewModel;
import androidx.lifecycle.ViewModelProvider;
import com.ttstd.dialer.base.BaseFragment;
import com.ttstd.dialer.base.mvvm.BaseViewModel;
import com.ttstd.dialer.utils.Logger;
import java.lang.ref.WeakReference;
import java.lang.reflect.ParameterizedType;
/**
* @author: lml
* @date: 2021/12/15
* 优化生命周期管理,去掉冗余的 Bundle 定义
* @param <VM> ViewModel 类型
* @param <VDB> ViewDataBinding 类型
*/
public abstract class BaseMvvmFragment<VM extends ViewModel, VDB extends ViewDataBinding> extends BaseFragment {
protected String mTag = this.getClass().getSimpleName();
protected final String mTag = this.getClass().getSimpleName();
/**
* 是否顯示了
* 是否可见(用于懒加载逻辑)
*/
protected boolean mIsVisible;
/**
* 是否準備好了-Created
* View 是否准备完毕
*/
protected boolean mHasPrepare;
protected VM mViewModel;
protected VDB mViewDataBinding;
protected Class<VM> vmClass;
//
// protected Toolbar toolbar;
// protected View statusBarView;
//
protected Bundle bundle;//来自getArguments()
protected Bundle savedInstanceState;
// protected Context context;
/**
* 上下文
*/
private WeakReference<Context> ctx;
public Context getCtx() {
@@ -64,104 +51,85 @@ public abstract class BaseMvvmFragment<VM extends ViewModel, VDB extends ViewDat
@Override
public void onAttach(@NonNull Context context) {
super.onAttach(context);
// this.context = context;
ctx = new WeakReference<>(context);
}
/**
* onCreate、onResume里不能调用
*
* @return
*/
public boolean isAttached() {
boolean flag = getCtx() != null && isAdded();
Logger.e(" >> isAttached >>", "flag = " + flag);
return flag;
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// ViewModel 初始化
try {
Class<VM> vmClass = (Class<VM>) ((ParameterizedType) this.getClass().getGenericSuperclass()).getActualTypeArguments()[0];
mViewModel = new ViewModelProvider(this).get(vmClass);
if (mViewModel instanceof BaseViewModel) {
BaseViewModel<?, ?> baseVm = (BaseViewModel<?, ?>) mViewModel;
baseVm.setContext(getContext());
baseVm.setLifecycle(getLifecycleSubject());
}
} catch (Exception e) {
Logger.e(mTag, "ViewModel initialization failed: " + e.getMessage());
}
}
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
//ViewDataBinding
// ViewDataBinding 初始化
mViewDataBinding = DataBindingUtil.inflate(inflater, getLayoutId(), container, false);
//ViewModel
vmClass = (Class<VM>) ((ParameterizedType) this.getClass().getGenericSuperclass()).getActualTypeArguments()[0];
mViewModel = new ViewModelProvider(this).get(vmClass);
//
if (mViewModel instanceof BaseViewModel) {
((BaseViewModel<?, ?>) mViewModel).setVDBinding(mViewDataBinding);
}
return mViewDataBinding.getRoot();
}
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
mViewDataBinding.setLifecycleOwner(getViewLifecycleOwner());
// if (initStatusBarToolBar()) {
// toolbar = getToolbar();
// }
//注册eventbus
// if (getClass().isAnnotationPresent(BindEventBus.class))
// EventBusManager.register(this);
//
// fitsLayoutOverlap();
initDataBinding();
initView(bundle = getArguments());
//
initData(this.savedInstanceState = savedInstanceState);
//
if (mIsVisible) {
// 去掉重复的 bundle 和 savedInstanceState 定义,直接从参数/方法获取
initView(getArguments());
initData(savedInstanceState);
mHasPrepare = true;
// 检查初始可见性
if (mIsVisible || getUserVisibleHint()) {
mIsVisible = true;
onEnter();
}
mHasPrepare = true;
//
// LiveDataBus.get().with(ConstantUtils.DATA_BUS_LOADING_FRAGMENT, Boolean.class).observe(getActivity(), bool -> {
// L.e(" >> LiveDataBus >> DATA_BUS_LOADING_FRAGMENT: %s", bool);
// if(bool) {
// showLoading(R.string.str_please_wait);
// } else {
// hideLoading();
// }
// });
}
@Override
public void onDestroyView() {
super.onDestroyView();
mHasPrepare = false;
// 及时解绑 Binding,防止内存泄漏
if (mViewModel instanceof BaseViewModel) {
((BaseViewModel<?, ?>) mViewModel).setVDBinding(null);
}
mViewDataBinding = null;
//移除eventbus
// if (getClass().isAnnotationPresent(BindEventBus.class))
// EventBusManager.unregister(this);
//
}
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
if (mIsVisible == getUserVisibleHint())
return;
mIsVisible = getUserVisibleHint();
if (mIsVisible == isVisibleToUser) return;
mIsVisible = isVisibleToUser;
if (mIsVisible) {
if (!mHasPrepare)
return;
onEnter();
if (mHasPrepare) {
onEnter();
}
} else {
onExit();
if (mHasPrepare) {
onExit();
}
}
}
@LayoutRes
protected abstract int getLayoutId();
// protected abstract Toolbar getToolbar();
// protected View getStatusView() {
// return null;
// }
protected abstract void initDataBinding();
protected abstract void initView(Bundle bundle);
@@ -171,105 +139,15 @@ public abstract class BaseMvvmFragment<VM extends ViewModel, VDB extends ViewDat
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
// fitsLayoutOverlap();
}
// protected boolean isImmersionBarEnabled() {
// return true;
// }
// protected boolean initStatusBarToolBar() {
// return true;
// }
// private void fitsLayoutOverlap() {
// if (!isImmersionBarEnabled()) return;
// if (statusBarView != null) {
// ImmersionBar.setStatusBarView(getActivity(), statusBarView);
// }
// if (toolbar != null) {
// ImmersionBar.setTitleBar(getActivity(), toolbar);
// }
// }
protected void hideInputMethod(Activity activity) {
InputMethodManager imm = (InputMethodManager) activity.getSystemService(Activity.INPUT_METHOD_SERVICE);
View view = activity.getCurrentFocus();
if (view != null) {
imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
}
}
protected void hideInputMethod(Activity activity, EditText editText) {
InputMethodManager imm = (InputMethodManager) editText.getContext().getSystemService(Activity.INPUT_METHOD_SERVICE);
View view = activity.getCurrentFocus();
if (view != null) {
imm.hideSoftInputFromWindow(view.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
}
}
protected void showInputMethod(EditText editText) {
InputMethodManager imm = (InputMethodManager) editText.getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
imm.showSoftInput(editText, InputMethodManager.SHOW_FORCED);
}
// private CustomDialog mWaitDialog;
//
// public void showLoading(@StringRes int contentID) {
// showLoading(contentID, R.color.white);
// }
//
// public void showLoading(@StringRes int contentID, @ColorRes int color) {
// hideLoading();
// DialogX.init(getActivity());
// if (color == R.color.white) {
// mWaitDialog = DialogXUtil.getInstance().showLoading(getActivity(), getString(contentID), getResources().getColor(color));
// } else {
// mWaitDialog = DialogXUtil.getInstance().showLoading_black(getActivity(), getString(contentID), getResources().getColor(color));
// }
// }
//
// public void updateLoadingTip(@StringRes int messageID, int percent) {
// try {
// if (mWaitDialog != null && mWaitDiaLogger.isShow()) {
// TextView tvTip = mWaitDialog.getCustomView().findViewById(R.id.tv_load_tip);
// if (tvTip != null)
// tvTip.setText(getResources().getString(messageID) + (percent == -1 ? "" : percent + "%"));
// }
// } catch (Exception e) {
// e.printStackTrace();
// }
// }
//
// public boolean isShowLoading() {
// return mWaitDialog != null && mWaitDiaLogger.isShow();
// }
//
// public void hideLoading() {
// try {
// boolean isShow = isShowLoading();
// L.d(" >> hideLoading :: isShow: %s", isShow);
// if (isShow)
// mWaitDiaLogger.dismiss();
// } catch (Exception e) {
// e.printStackTrace();
// }
// }
/**
* 進入界面
*/
protected void onEnter() {
}
/**
* 離開界面
*/
protected void onExit() {
}
public boolean isAttached() {
return getCtx() != null && isAdded();
}
}