package cn.sinata.xldutils.fragment; import android.content.Context; import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import androidx.annotation.Nullable; import androidx.fragment.app.Fragment; import cn.sinata.xldutils.R; import cn.sinata.xldutils.utils.DensityUtil; import cn.sinata.xldutils.utils.Toast; import cn.sinata.xldutils.view.utils.ViewHolder; import cn.sinata.xldutils.widget.ProgressDialog; import io.reactivex.disposables.CompositeDisposable; import io.reactivex.disposables.Disposable; /** * fragment ,单独在activity使用请设置setUserVisibleHint(true),结合viewpager使用不需要 */ public abstract class BaseFragment extends Fragment { private ProgressDialog dialog; protected Context context; protected int mScreenWidth; public View DictorView; protected abstract int getContentViewLayoutID(); protected abstract void onFirstVisibleToUser(); protected abstract void onVisibleToUser(); protected abstract void onInvisibleToUser(); private boolean isFirstResume = true; private boolean isFirstVisible = true; private boolean isFirstInvisible = true; private boolean isPrepared; protected ViewHolder mHolder; private CompositeDisposable compositeSubscription; @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); context = getActivity(); mScreenWidth = DensityUtil.getDeviceWidth(context); initPrepare(); } @Nullable @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { if (getContentViewLayoutID() != 0) { DictorView = inflater.inflate(getContentViewLayoutID(), null); return DictorView; } else { return super.onCreateView(inflater, container, savedInstanceState); } } @Override public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); compositeSubscription = new CompositeDisposable(); mHolder = new ViewHolder(view); DictorView = view; } public void addDisposable(Disposable disposable){ compositeSubscription.add(disposable); } @Override public void onResume() { super.onResume(); if (isFirstResume){ isFirstResume = false; return; } if (getUserVisibleHint()){ onVisibleToUser(); } } @Override public void onPause() { super.onPause(); if (getUserVisibleHint()) { onInvisibleToUser(); } } @Override public void setUserVisibleHint(boolean isVisibleToUser) { super.setUserVisibleHint(isVisibleToUser); if (isVisibleToUser) { if (isFirstVisible) { isFirstVisible = false; initPrepare(); } else { onVisibleToUser(); } } else { if (isFirstInvisible) { isFirstInvisible = false; // onFirstUserInvisible(); } else { onInvisibleToUser(); } } } protected T bind(int resId){ return mHolder.bind(resId); } @Override public void onDetach() { super.onDetach(); if (compositeSubscription!=null&&!compositeSubscription.isDisposed()){ compositeSubscription.dispose(); } // for bug ---> java.lang.IllegalStateException: Activity has been destroyed //noinspection TryWithIdenticalCatches // try { // Field childFragmentManager = Fragment.class.getDeclaredField("mChildFragmentManager"); // childFragmentManager.setAccessible(true); // childFragmentManager.set(this, null); // // } catch (NoSuchFieldException e) { // throw new RuntimeException(e); // } catch (IllegalAccessException e) { // throw new RuntimeException(e); // } } private synchronized void initPrepare() { if (isPrepared) { onFirstVisibleToUser(); } else { isPrepared = true; } } /** * 查找 View * @param paramInt * @return */ public final T findViewById(int paramInt) { if (getView()==null){ return null; } //noinspection unchecked return (T)getView().findViewById(paramInt); } public View getDictorView() { return DictorView; } /** * 显示加载提示窗 */ public void showDialog(){ showDialog("加载中..."); } /** * 显示加载提示窗 * @param msg 提示文字 */ protected void showDialog(CharSequence msg){ showDialog(msg,false); } /** * 显示加载提示窗 * @param msg 提示文字 * @param canCancel 是否可手动取消 */ protected void showDialog(CharSequence msg,boolean canCancel){ if (context == null) { return; } if(dialog == null){ dialog = new ProgressDialog(context, R.style.Theme_ProgressDialog); } dialog.setCanceledOnTouchOutside(canCancel); dialog.setMessage(msg); if (!dialog.isShowing()) { dialog.show(); } } /** * 关闭加载窗 */ public void dismissDialog(){ if (dialog != null && dialog.isShowing()){ dialog.dismiss(); } } /** * 显示Toast * @param msg 显示文字 */ public void showToast(String msg){ if (context == null) { return; } Toast.create(context).show(msg); } }