Bladeren bron

Fragment搞定

詹子聪 5 jaren geleden
bovenliggende
commit
5befebc8bf

+ 21 - 0
common/src/main/java/com/miekir/common/utils/ViewTool.java

@@ -1,11 +1,13 @@
 package com.miekir.common.utils;
 
 import android.app.Activity;
+import android.content.Context;
 import android.os.SystemClock;
 import android.view.MotionEvent;
 import android.view.View;
 import android.view.ViewTreeObserver;
 import android.view.WindowManager;
+import android.view.inputmethod.InputMethodManager;
 
 /**
  *
@@ -52,4 +54,23 @@ public class ViewTool {
             }
         });
     }
+
+    /**
+     * 隐藏输入法
+     */
+    public static void hideInputMethod(Activity activity, View rootView) {
+        if (rootView != null) {
+            rootView.requestFocus();
+        }
+
+        final InputMethodManager imm = (InputMethodManager) activity.getApplicationContext().getSystemService(Context.INPUT_METHOD_SERVICE);
+        if (imm == null) {
+            return;
+        }
+
+        final View currentFocusView = activity.getCurrentFocus();
+        if (currentFocusView != null) {
+            imm.hideSoftInputFromWindow(currentFocusView.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
+        }
+    }
 }

+ 20 - 29
mvp/src/main/java/com/miekir/mvp/base/BaseActivity.java

@@ -1,16 +1,15 @@
 package com.miekir.mvp.base;
 
-import android.content.Context;
 import android.os.Bundle;
 import android.os.Looper;
 import android.view.LayoutInflater;
 import android.view.MotionEvent;
 import android.view.View;
 import android.view.WindowManager;
-import android.view.inputmethod.InputMethodManager;
 
 import androidx.appcompat.app.AppCompatActivity;
 
+import com.miekir.common.utils.ViewTool;
 import com.miekir.mvp.widget.LoadingView;
 
 /**
@@ -20,6 +19,12 @@ public abstract class BaseActivity extends AppCompatActivity {
     private LoadingView mLoadingDialog;
     private View rootView;
 
+    /**
+     * 获取布局文件Id
+     * @return 布局Id
+     */
+    public abstract int getLayoutId();
+
     @Override
     protected void onCreate(Bundle savedInstanceState) {
         // 状态栏深色模式,改变状态栏文字颜色
@@ -36,7 +41,7 @@ public abstract class BaseActivity extends AppCompatActivity {
                 // 点击空白处隐藏输入法(要配合Activity根布局增加以下标志使用
                 // android:focusable="true"
                 // android:focusableInTouchMode="true")
-                hideInputMethod();
+                ViewTool.hideInputMethod(BaseActivity.this, rootView);
                 return false;
             }
         };
@@ -54,34 +59,10 @@ public abstract class BaseActivity extends AppCompatActivity {
         });
     }
 
-    /**
-     * 可见任务被取消
-     */
-    public abstract void onProgressTaskCancel();
-
-    /**
-     * 隐藏输入法
-     */
-    protected void hideInputMethod() {
-        if (rootView != null) {
-            rootView.requestFocus();
-        }
-
-        final InputMethodManager imm = (InputMethodManager) getApplicationContext().getSystemService(Context.INPUT_METHOD_SERVICE);
-        if (imm == null) {
-            return;
-        }
-
-        final View currentFocusView = getCurrentFocus();
-        if (currentFocusView != null) {
-            imm.hideSoftInputFromWindow(currentFocusView.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
-        }
-    }
-
     @Override
     protected void onPause() {
         // 必须要在onPause隐藏键盘,在onDestroy就太晚了
-        hideInputMethod();
+        ViewTool.hideInputMethod(this, rootView);
         super.onPause();
     }
 
@@ -91,14 +72,24 @@ public abstract class BaseActivity extends AppCompatActivity {
         getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN);
     }
 
-    public abstract int getLayoutId();
+    /**
+     * 可见任务被取消
+     */
+    public abstract void onProgressTaskCancel();
 
+    /**
+     * 视图初始化
+     * @param savedInstanceState
+     */
     public abstract void initViews(Bundle savedInstanceState);
 
     private boolean isMainThread() {
         return Looper.myLooper() == Looper.getMainLooper();
     }
 
+    /**
+     * 加载框相关
+     */
     public void showLoading() {
         showLoading(true);
     }

+ 53 - 29
mvp/src/main/java/com/miekir/mvp/base/BaseFragment.java

@@ -1,5 +1,6 @@
 package com.miekir.mvp.base;
 
+import android.app.Activity;
 import android.os.Bundle;
 import android.os.Looper;
 import android.view.LayoutInflater;
@@ -17,22 +18,19 @@ import com.miekir.mvp.widget.LoadingView;
 
 public abstract class BaseFragment extends Fragment {
     public FragmentActivity activity;
-    //private Unbinder mBinder;
     private LoadingView mLoadingDialog;
     protected View rootView;
 
     /**
      * 设置布局layout
-     *
      * @return 布局文件id
      */
-    public abstract @LayoutRes
-    int getLayoutResId();
+    public abstract @LayoutRes int getLayoutId();
 
     @Nullable
     @Override
     public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
-        rootView = inflater.inflate(getLayoutResId(), container, false);
+        rootView = inflater.inflate(getLayoutId(), container, false);
         activity = getActivity();
         return rootView;
     }
@@ -40,22 +38,36 @@ public abstract class BaseFragment extends Fragment {
     @Override
     public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
         super.onViewCreated(view, savedInstanceState);
-        //mBinder = ButterKnife.bind(this, view);
+
         mLoadingDialog = new LoadingView(getActivity());
         mLoadingDialog.setCancelListener(new LoadingView.OnLoadingCancelListener() {
             @Override
             public void onLoadingCancel() {
-                onTaskCancel();
+                mLoadingTime = 0;
+                onProgressTaskCancel();
             }
         });
     }
 
-    public abstract void onTaskCancel();
+    @Override
+    public void onDestroyView() {
+        super.onDestroyView();
+        hideLoading();
+        activity = null;
+    }
+
+    /**
+     * 可见任务被取消
+     */
+    public abstract void onProgressTaskCancel();
 
     private boolean isMainThread() {
         return Looper.myLooper() == Looper.getMainLooper();
     }
 
+    /**
+     * 加载框相关
+     */
     public void showLoading() {
         showLoading(true);
     }
@@ -68,7 +80,33 @@ public abstract class BaseFragment extends Fragment {
         showLoading(msg, true);
     }
 
+    private volatile int mLoadingTime = 0;
+    private synchronized void onLoadTimeChange(boolean isShow) {
+        if (isShow) {
+            mLoadingTime++;
+        } else {
+            mLoadingTime--;
+        }
+
+        if (mLoadingTime <= 0 && mLoadingDialog != null) {
+            mLoadingTime = 0;
+            if (isMainThread()) {
+                mLoadingDialog.close();
+            } else {
+                Activity activity = getActivity();
+                if (activity != null) {
+                    activity.runOnUiThread(new Runnable() {
+                        @Override
+                        public void run() {
+                            mLoadingDialog.close();
+                        }
+                    });
+                }
+            }
+        }
+    }
     public void showLoading(final String msg, final boolean cancelable) {
+        onLoadTimeChange(true);
         if (mLoadingDialog == null) {
             return;
         }
@@ -76,35 +114,21 @@ public abstract class BaseFragment extends Fragment {
         if (isMainThread()) {
             mLoadingDialog.show(msg);
         } else {
-            activity.runOnUiThread(new Runnable() {
-                @Override
-                public void run() {
-                    mLoadingDialog.show(msg, cancelable);
-                }
-            });
-        }
-    }
-
-    public void hideLoading() {
-        if (mLoadingDialog != null) {
-            if (isMainThread()) {
-                mLoadingDialog.close();
-            } else {
+            Activity activity = getActivity();
+            if (activity != null) {
                 activity.runOnUiThread(new Runnable() {
                     @Override
                     public void run() {
-                        mLoadingDialog.close();
+                        mLoadingDialog.show(msg, cancelable);
                     }
                 });
             }
         }
     }
 
-    @Override
-    public void onDestroyView() {
-        super.onDestroyView();
-        //mBinder.unbind();
-        hideLoading();
-        activity = null;
+    public void hideLoading() {
+        onLoadTimeChange(false);
     }
+
+
 }

+ 70 - 102
mvp/src/main/java/com/miekir/mvp/view/BaseMvpFragment.java

@@ -1,108 +1,76 @@
 package com.miekir.mvp.view;
 
+import android.os.Bundle;
+import android.view.View;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+
 import com.miekir.mvp.base.BaseFragment;
+import com.miekir.mvp.presenter.BasePresenter;
+
+import java.util.ArrayList;
+import java.util.List;
 
-// 第三个参数的类型
-//String objTypeName = method.getGenericParameterTypes()[2].toString();
-//if (objectParamsList.contains(objTypeName)) {
-//    throw new AssertionError("第3个参数为" + objTypeName + "的方法有多个,应该合并为一个方法");
-//}
-//objectParamsList.add(objTypeName);
 public abstract class BaseMvpFragment extends BaseFragment implements IView {
-//    /**
-//     * 是否被创建了
-//     */
-//    protected boolean isViewCreated;
-//    /**
-//     * 当前是否可见
-//     */
-//    protected boolean isUIVisible;
-//
-//    private List<Method> mDataMethodList = new ArrayList<>();
-//    private List<BasePresenter> mInjectPresenters = new ArrayList<>();
-//
-//    private volatile int mLoadingNum;
-//    @Override
-//    public synchronized int onLoadTimeChange(boolean isAdd, String message) {
-//        if (isAdd) {
-//            mLoadingNum = mLoadingNum +1;
-//        } else {
-//            mLoadingNum = mLoadingNum -1;
-//        }
-//
-//        if (mLoadingNum <= 0) {
-//            mLoadingNum = 0;
-//            dismissLoading();
-//        } else {
-//            showLoading(message);
-//        }
-//        return mLoadingNum;
-//    }
-//
-//    @Override
-//    public void onTaskCancel() {
-//        mLoadingNum = 0;
-//        for (BasePresenter viewModel : mInjectPresenters) {
-//            viewModel.onTaskCancel();
-//        }
-//    }
-//
-//    @Override
-//    public  void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
-//        ViewHelper.initVariables(mInjectPresenters, this, this);
-//        ViewHelper.initCallbacks(mDataMethodList, getClass());
-//
-//        isViewCreated = true;
-//        onViewInit();
-//        loadData();
-//    }
-//
-//
-//
-//    /**
-//     * View初始化
-//     */
-//    protected abstract void onViewInit();
-//
-//    @Override
-//    public void setUserVisibleHint(boolean isVisibleToUser) {
-//        super.setUserVisibleHint(isVisibleToUser);
-//        isUIVisible = isVisibleToUser;
-//        if (isVisibleToUser) {
-//            loadData();
-//        }
-//    }
-//
-//    /**
-//     * 懒加载,当Fragment可见的时候,再去加载数据
-//     * 应用初始化会先调用完所有的setUserVisibleHint再调用onViewCreated,然后切换的时候,就只调用setUserVisibleHint了
-//     */
-//    private void loadData() {
-//        if (isViewCreated && isUIVisible) {
-//            isViewCreated = false;
-//            isUIVisible = false;
-//            onLazyLoad();
-//        }
-//    }
-//
-//    /**
-//     * 懒加载,初始化加载数据
-//     */
-//    protected abstract void onLazyLoad();
-//
-//    @Override
-//    public void onDestroyView() {
-//        super.onDestroyView();
-//        ViewHelper.clearPresenters(mInjectPresenters, this);
-//        mDataMethodList.clear();
-//    }
-//
-//    /**
-//     * 回调
-//     * @param result
-//     */
-//    @Override
-//    public void onDataResult(DataResult result) {
-//        ViewHelper.handleDataResult(this, mDataMethodList, result);
-//    }
+    /**
+     * 是否被创建了
+     */
+    protected boolean isViewCreated;
+    /**
+     * 当前是否可见
+     */
+    protected boolean isUIVisible;
+
+    private List<BasePresenter<?>> mInjectPresenters = new ArrayList<>();
+
+    @Override
+    public void onProgressTaskCancel() {
+        for (BasePresenter<?> presenter : mInjectPresenters) {
+            presenter.onProgressTaskCancel();
+        }
+    }
+
+    @Override
+    public  void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
+        ViewHelper.initVariables(mInjectPresenters, this, this);
+
+        isViewCreated = true;
+        onViewInit();
+        loadData();
+    }
+
+
+
+    /**
+     * View初始化
+     */
+    protected abstract void onViewInit();
+
+    @Override
+    public void setUserVisibleHint(boolean isVisibleToUser) {
+        super.setUserVisibleHint(isVisibleToUser);
+        isUIVisible = isVisibleToUser;
+        if (isVisibleToUser) {
+            loadData();
+        }
+    }
+
+    /**
+     * 懒加载,当Fragment可见的时候,再去加载数据
+     * 应用初始化会先调用完所有的setUserVisibleHint再调用onViewCreated,然后切换的时候,就只调用setUserVisibleHint了
+     */
+    private void loadData() {
+        if (isViewCreated && isUIVisible) {
+            isViewCreated = false;
+            isUIVisible = false;
+            onLazyLoad();
+        }
+    }
+
+    /**
+     * 懒加载,初始化加载数据
+     */
+    protected abstract void onLazyLoad();
+
 }