Explorar el Código

提交1.0.6版本,整合注解方法,添加BindString注解,将类区分文件夹

benyanyi hace 5 años
padre
commit
3fb80c5e92

+ 25 - 20
README.md

@@ -9,29 +9,34 @@ module 下添加
 ### 使用方法
 
 在Activity中添加
-    
-    ViewBind.bind(this);
-    
+~~~
+ViewBind.bind(this);
+~~~
 在Fragment中添加
-
-    ViewBind.bind(view, this);
-    
+~~~
+ViewBind.bind(view, this);
+~~~
+单view中绑定
+~~~
+ViewBind.bind(view);
+~~~
 绑定id
-    
-    @BindView(R.id.xxx)
-    
+ ~~~
+@BindView(R.id.xxx)
+ ~~~
+ 绑定string中对应字符
+ ~~~
+ @BindString(R.string.xxx)
+ ~~~
 添加点击方法
-
-    @OnClick({R.id.xxx, R.id.xxx})
-    
-添加点击方法网络判断
-
-    @ClickNet(使用默认值,其中存在两个参数,netErrorMsg默认值为“网络错误”,isCheckNet默认值为true(也就是说点击方法网络判断打开))
-    @ClickNet(netErrorMsg = "请检查您的网络")(更改点击事件提示问题)
-    @ClickNet(isCheckNet = false)(关闭点击事件网络监听)
-    
-    
+~~~
+@OnClick({R.id.xxx, R.id.xxx}, isDoubleClick = true, isCheckNet = true, netErrorMsg = "网络错误")
+isDoubleClick 是否可以重复点击判断,默认为false,短时间重复点击有点击事件反应
+isCheckNet 点击事件网络监听,默认为false,点击事件时不判断网络状态
+netErrorMsg 网络状态报错提醒,isCheckNet为关闭状态时无反应,默认为“网络错误”,可以自己自定义提醒的值
+ ~~~
 ### 更新记录
+* 2020-04-15 更新1.0.6版本,去除ClickNet注解,将ClickNet注解功能添加至OnClick,并添加能否短时间重复点击判断,添加BindString注解
 * 2019-06-26 更新1.0.4版本,去除重复方法
 * 2019-06-12 更新1.0.2版本, 方法优化,更改包名,统一开源库包名
 * 2019-05-29 提交1.0.1版本,优化一些已知细节
@@ -41,7 +46,7 @@ module 下添加
 若在使用过程中出现什么问题,可以联系作者<br/>
 作者:演绎<br/>
 QQ:1541612424<br/>
-email: work@yanyi.red<br/>
+email: ben@yanyi.red<br/>
 微信公众号:benyanyi(演绎未来)&nbsp;&nbsp;&nbsp;将会不定期的更新关于android的一些文章
 
 

+ 3 - 1
app/build.gradle

@@ -28,5 +28,7 @@ dependencies {
     testImplementation 'junit:junit:4.12'
     androidTestImplementation 'com.android.support.test:runner:1.0.2'
     androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
-    implementation project(':viewbind')
+//    implementation project(':viewbind')
+    implementation 'com.yanyi.benyanyi:viewbind:1.0.5-base'
 }
+

+ 2 - 0
app/src/main/AndroidManifest.xml

@@ -1,6 +1,8 @@
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
     package="com.mylove.bindviewlib">
 
+    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
+
     <application
         android:allowBackup="true"
         android:icon="@mipmap/ic_launcher"

+ 12 - 4
app/src/main/java/com/mylove/bindviewlib/IndexActivity.java

@@ -4,10 +4,12 @@ import android.os.Bundle;
 import android.support.annotation.Nullable;
 import android.support.v7.app.AppCompatActivity;
 import android.util.Log;
-import android.widget.Toast;
+import android.widget.TextView;
 
-import com.benyanyi.viewbind.OnClick;
 import com.benyanyi.viewbind.ViewBind;
+import com.benyanyi.viewbind.annotation.BindString;
+import com.benyanyi.viewbind.annotation.BindView;
+import com.benyanyi.viewbind.annotation.OnClick;
 
 /**
  * @author YanYi
@@ -16,16 +18,22 @@ import com.benyanyi.viewbind.ViewBind;
  * @overview
  */
 public class IndexActivity extends AppCompatActivity {
+    @BindView(R.id.msg)
+    private TextView msg;
+    @BindString(R.string.app_name)
+    private String appName;
+
     @Override
     protected void onCreate(@Nullable Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         setContentView(R.layout.act_main);
         ViewBind.bind(this);
+        Log.v("appname", appName);
     }
 
-    @OnClick({R.id.but})
+    @OnClick(value = R.id.but, isDoubleClick = true, isCheckNet = true, netErrorMsg = "没有连接网络")
     public void onClick() {
         Log.v("测试", "点击");
-        Toast.makeText(this, "测试", Toast.LENGTH_SHORT).show();
+//        Toast.makeText(this, "测试", Toast.LENGTH_SHORT).show();
     }
 }

+ 12 - 0
app/src/main/res/layout/act_test.xml

@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:orientation="vertical">
+
+    <TextView
+        android:id="@+id/msg"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent" />
+
+</LinearLayout>

+ 1 - 1
viewbind/bintrayUpload.gradle

@@ -7,7 +7,7 @@ def siteUrl = 'http://www.yanyis.space/yanyi/bindviewlib' // 项目主页。
 def gitUrl = 'http://www.yanyis.space/yanyi/bindviewlib.git' // Git仓库的url。
 
 group = "com.yanyi.benyanyi"// 唯一包名,比如compile 'com.ansen.http:okhttpencapsulation:1.0.1'中的com.ansen.http就是这里配置的。
-version = "1.0.4"//项目引用的版本号,比如compile 'com.ansen.http:okhttpencapsulation:1.0.1'中的1.0.1就是这里配置的。
+version = "1.0.6"//项目引用的版本号,比如compile 'com.ansen.http:okhttpencapsulation:1.0.1'中的1.0.1就是这里配置的。
 install {
     repositories.mavenInstaller {
         // This generates POM.xml with proper parameters

+ 4 - 3
viewbind/build.gradle

@@ -4,7 +4,6 @@ android {
     compileSdkVersion 28
 
 
-
     defaultConfig {
         minSdkVersion 15
         targetSdkVersion 28
@@ -17,11 +16,13 @@ android {
 
     buildTypes {
         release {
-            minifyEnabled false
+            minifyEnabled true
             proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
         }
     }
-
+    lintOptions {
+        abortOnError false
+    }
 }
 
 dependencies {

+ 25 - 0
viewbind/proguard-rules.pro

@@ -19,3 +19,28 @@
 # If you keep the line number information, uncomment this to
 # hide the original source file name.
 #-renamesourcefileattribute SourceFile
+#表示proguard对代码进行迭代优化的次数,Android一般为5
+#-optimizationpasses n
+
+-keep class com.benyanyi.viewbind.*
+-keep class com.benyanyi.viewbind.**{*;}
+-keep class com.benyanyi.viewbind.annotation.*
+-keep class com.benyanyi.viewbind.init.*
+-keep class com.benyanyi.viewbind.inject.*
+-keep class com.benyanyi.viewbind.listener.*
+
+-keepattributes *Annotation*
+
+-keepclassmembers class com.benyanyi.viewbind.annotation.*{*;}
+
+-keepclassmembers class com.benyanyi.ViewBind.ViewBind.**{*;}
+
+-keep class com.benyanyi.ViewBind.ViewBind {
+    public <methods>;
+}
+-keepattributes Signature
+
+# 对于带有回调函数的onXXEvent、**On*Listener的,不能被混淆
+-keepclassmembers class * {
+    void *(**On*Listener);
+}

+ 3 - 1
viewbind/src/main/AndroidManifest.xml

@@ -1,2 +1,4 @@
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
-    package="com.benyanyi.viewbind" />
+    package="com.benyanyi.viewbind">
+
+</manifest>

+ 0 - 56
viewbind/src/main/java/com/benyanyi/viewbind/ClickListener.java

@@ -1,56 +0,0 @@
-package com.benyanyi.viewbind;
-
-import android.view.View;
-import android.widget.Toast;
-
-import java.lang.reflect.Method;
-
-/**
- * @author BenYanYi
- * @date 2018/12/26 10:32
- * @email ben@yanyi.red
- * @overview
- */
-class ClickListener implements View.OnClickListener {
-    private long lastClickTime;
-    private Method method;
-    private Object object;
-    private String netErrorMsg;
-    private boolean isCheckNet;
-
-    ClickListener(Method method, Object object, String netErrorMsg, boolean isCheckNet) {
-        this.method = method;
-        this.object = object;
-        this.netErrorMsg = netErrorMsg;
-        this.isCheckNet = isCheckNet;
-    }
-
-    @Override
-    public void onClick(View v) {
-        long time = System.currentTimeMillis();
-        if (isCheckNet) {
-            //判断网络问题
-            if (!NetUtil.networkAvailable(v.getContext())) {
-                Toast.makeText(v.getContext(), netErrorMsg, Toast.LENGTH_SHORT).show();
-                return;
-            }
-        }
-        long timeD = time - lastClickTime;
-        long times = 600;
-        if (0 < timeD && timeD < times) {
-            return;
-        }
-        lastClickTime = time;
-        method.setAccessible(true);
-        try {
-            method.invoke(object, v);
-        } catch (Exception e) {
-            e.printStackTrace();
-            try {
-                method.invoke(object, new Object[]{});
-            } catch (Exception e1) {
-                e1.printStackTrace();
-            }
-        }
-    }
-}

+ 0 - 35
viewbind/src/main/java/com/benyanyi/viewbind/ClickNet.java

@@ -1,35 +0,0 @@
-package com.benyanyi.viewbind;
-
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-/**
- * @author BenYanYi
- * @date 2018/12/26 10:10
- * @email ben@yanyi.red
- * @overview 判断点击时候网络
- */
-//@Documented:指明该注解可以用于生成doc
-//@Inherited:该注解可以被自动继承
-//@Retention:指明在什么级别显示该注解:
-//        RetentionPolicy.SOURCE 注解存在于源代码中,编译时会被抛弃
-//        RetentionPolicy.CLASS 注解会被编译到class文件中,但是JVM会忽略
-//        RetentionPolicy.RUNTIME JVM会读取注解,同时会保存到class文件中
-//@Target:指明该注解可以注解的程序范围
-//        ElementType.TYPE 用于类,接口,枚举但不能是注解
-//        ElementType.FIELD 作用于字段,包含枚举值
-//        ElementType.METHOD 作用于方法,不包含构造方法
-//        ElementType.PARAMETER 作用于方法的参数
-//        ElementType.CONSTRUCTOR 作用于构造方法
-//        ElementType.LOCAL_VERIABLE 作用于本地变量或者catch语句
-//        ElementType.ANNOTATION_TYPE 作用于注解
-//        ElementType.PACKAGE 作用于包
-@Target(ElementType.METHOD)
-@Retention(RetentionPolicy.RUNTIME)
-public @interface ClickNet {
-    String netErrorMsg() default "网络错误";
-
-    boolean isCheckNet() default true;
-}

+ 0 - 33
viewbind/src/main/java/com/benyanyi/viewbind/Exceptions.java

@@ -1,33 +0,0 @@
-package com.benyanyi.viewbind;
-
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-/**
- * @author BenYanYi
- * @date 2019/01/04 16:44
- * @email ben@yanyi.red
- * @overview
- */
-//@Documented:指明该注解可以用于生成doc
-//@Inherited:该注解可以被自动继承
-//@Retention:指明在什么级别显示该注解:
-//        RetentionPolicy.SOURCE 注解存在于源代码中,编译时会被抛弃
-//        RetentionPolicy.CLASS 注解会被编译到class文件中,但是JVM会忽略
-//        RetentionPolicy.RUNTIME JVM会读取注解,同时会保存到class文件中
-//@Target:指明该注解可以注解的程序范围
-//        ElementType.TYPE 用于类,接口,枚举但不能是注解
-//        ElementType.FIELD 作用于字段,包含枚举值
-//        ElementType.METHOD 作用于方法,不包含构造方法
-//        ElementType.PARAMETER 作用于方法的参数
-//        ElementType.CONSTRUCTOR 作用于构造方法
-//        ElementType.LOCAL_VERIABLE 作用于本地变量或者catch语句
-//        ElementType.ANNOTATION_TYPE 作用于注解
-//        ElementType.PACKAGE 作用于包
-@Target(ElementType.METHOD)
-@Retention(RetentionPolicy.RUNTIME)
-@interface Exceptions {
-
-}

+ 4 - 0
viewbind/src/main/java/com/benyanyi/viewbind/ViewBind.java

@@ -3,6 +3,9 @@ package com.benyanyi.viewbind;
 import android.app.Activity;
 import android.view.View;
 
+import com.benyanyi.viewbind.init.ViewInit;
+import com.benyanyi.viewbind.inject.ViewInject;
+
 /**
  * @author BenYanYi
  * @date 2018/12/26 09:13
@@ -25,6 +28,7 @@ public class ViewBind {
 
     private static void bind(ViewInit inject, Object object) {
         ViewInject.injectFiled(inject, object);
+        ViewInject.injectString(inject, object);
         ViewInject.injectClick(inject, object);
 //        ViewInject.injectException(inject, object);
     }

+ 20 - 0
viewbind/src/main/java/com/benyanyi/viewbind/annotation/BindString.java

@@ -0,0 +1,20 @@
+package com.benyanyi.viewbind.annotation;
+
+import android.support.annotation.StringRes;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * @author Administrator
+ * @date 2020/4/15 14:23
+ * @email ben@yanyi.red
+ * @overview
+ */
+@Target(ElementType.FIELD)
+@Retention(RetentionPolicy.RUNTIME)
+public @interface BindString {
+    @StringRes int value();
+}

+ 1 - 1
viewbind/src/main/java/com/benyanyi/viewbind/BindView.java → viewbind/src/main/java/com/benyanyi/viewbind/annotation/BindView.java

@@ -1,4 +1,4 @@
-package com.benyanyi.viewbind;
+package com.benyanyi.viewbind.annotation;
 
 import android.support.annotation.IdRes;
 

+ 8 - 1
viewbind/src/main/java/com/benyanyi/viewbind/OnClick.java → viewbind/src/main/java/com/benyanyi/viewbind/annotation/OnClick.java

@@ -1,4 +1,4 @@
-package com.benyanyi.viewbind;
+package com.benyanyi.viewbind.annotation;
 
 import java.lang.annotation.ElementType;
 import java.lang.annotation.Retention;
@@ -30,4 +30,11 @@ import java.lang.annotation.Target;
 @Retention(RetentionPolicy.RUNTIME)
 public @interface OnClick {
     int[] value();
+
+    boolean isCheckNet() default false;
+
+    String netErrorMsg() default "网络错误";
+
+    boolean isDoubleClick() default false;
+
 }

+ 15 - 5
viewbind/src/main/java/com/benyanyi/viewbind/ViewInit.java → viewbind/src/main/java/com/benyanyi/viewbind/init/ViewInit.java

@@ -1,7 +1,8 @@
-package com.benyanyi.viewbind;
+package com.benyanyi.viewbind.init;
 
 import android.app.Activity;
 import android.support.annotation.IdRes;
+import android.support.annotation.StringRes;
 import android.view.View;
 
 /**
@@ -10,23 +11,32 @@ import android.view.View;
  * @email ben@yanyi.red
  * @overview
  */
-class ViewInit {
+public class ViewInit {
     private Activity mActivity;
     private View mView;
 
-    ViewInit(Activity mActivity) {
+    public ViewInit(Activity mActivity) {
         this.mActivity = mActivity;
     }
 
-    ViewInit(View mView) {
+    public ViewInit(View mView) {
         this.mView = mView;
     }
 
-    View find(@IdRes int value) {
+    public View find(@IdRes int value) {
         if (mActivity != null) {
             return mActivity.findViewById(value);
         } else {
             return mView.findViewById(value);
         }
     }
+
+    public String string(@StringRes int value) {
+        if (mActivity != null) {
+            return mActivity.getString(value);
+        } else {
+            return mView.getContext().getString(value);
+        }
+    }
+
 }

+ 35 - 12
viewbind/src/main/java/com/benyanyi/viewbind/ViewInject.java → viewbind/src/main/java/com/benyanyi/viewbind/inject/ViewInject.java

@@ -1,7 +1,13 @@
-package com.benyanyi.viewbind;
+package com.benyanyi.viewbind.inject;
 
 import android.view.View;
 
+import com.benyanyi.viewbind.annotation.BindString;
+import com.benyanyi.viewbind.annotation.BindView;
+import com.benyanyi.viewbind.annotation.OnClick;
+import com.benyanyi.viewbind.init.ViewInit;
+import com.benyanyi.viewbind.listener.ViewBindClickListener;
+
 import java.lang.reflect.Field;
 import java.lang.reflect.Method;
 
@@ -11,11 +17,11 @@ import java.lang.reflect.Method;
  * @email ben@yanyi.red
  * @overview
  */
-class ViewInject {
+public class ViewInject {
     /**
      * 控件id反射
      */
-    static void injectFiled(ViewInit inject, Object object) {
+    public static void injectFiled(ViewInit inject, Object object) {
         Class<?> aClass = object.getClass();
         Field[] fields = aClass.getDeclaredFields();
         for (Field field : fields) {
@@ -35,10 +41,31 @@ class ViewInject {
         }
     }
 
+    /**
+     * string值反射
+     */
+    public static void injectString(ViewInit inject, Object object) {
+        Class<?> aClass = object.getClass();
+        Field[] fields = aClass.getDeclaredFields();
+        for (Field field : fields) {
+            BindString bindString = field.getAnnotation(BindString.class);
+            if (bindString != null) {
+                int value = bindString.value();
+                String string = inject.string(value);
+                field.setAccessible(true);
+                try {
+                    field.set(object, string);
+                } catch (Exception e) {
+                    e.printStackTrace();
+                }
+            }
+        }
+    }
+
     /**
      * 控件点击事件反射
      */
-    static void injectClick(ViewInit inject, Object object) {
+    public static void injectClick(ViewInit inject, Object object) {
         Class<?> aClass = object.getClass();
         Method[] methods = aClass.getDeclaredMethods();
         for (Method method : methods) {
@@ -48,15 +75,11 @@ class ViewInject {
                 if (values.length > 0) {
                     for (int value : values) {
                         View view = inject.find(value);
-                        String netErrorMsg = "";
-                        boolean isCheckNet = false;
-                        ClickNet clickNet = method.getAnnotation(ClickNet.class);
-                        if (clickNet != null) {
-                            netErrorMsg = clickNet.netErrorMsg();
-                            isCheckNet = clickNet.isCheckNet();
-                        }
+                        String netErrorMsg = onClick.netErrorMsg();
+                        boolean isCheckNet = onClick.isCheckNet();
+                        boolean doubleClick = onClick.isDoubleClick();
                         if (view != null) {
-                            view.setOnClickListener(new ClickListener(method, object, netErrorMsg, isCheckNet));
+                            view.setOnClickListener(new ViewBindClickListener(method, object, netErrorMsg, isCheckNet, doubleClick));
                         }
                     }
                 }

+ 2 - 2
viewbind/src/main/java/com/benyanyi/viewbind/NetUtil.java → viewbind/src/main/java/com/benyanyi/viewbind/listener/NetUtil.java

@@ -1,4 +1,4 @@
-package com.benyanyi.viewbind;
+package com.benyanyi.viewbind.listener;
 
 import android.content.Context;
 import android.net.ConnectivityManager;
@@ -20,7 +20,7 @@ class NetUtil {
                 return true;
             }
         } catch (Exception e) {
-            e.printStackTrace();
+            return false;
         }
         return false;
     }

+ 71 - 0
viewbind/src/main/java/com/benyanyi/viewbind/listener/ViewBindClickListener.java

@@ -0,0 +1,71 @@
+package com.benyanyi.viewbind.listener;
+
+import android.content.pm.PackageManager;
+import android.view.View;
+import android.widget.Toast;
+
+import java.lang.reflect.Method;
+
+/**
+ * @author BenYanYi
+ * @date 2018/12/26 10:32
+ * @email ben@yanyi.red
+ * @overview
+ */
+public class ViewBindClickListener implements View.OnClickListener {
+    private long lastClickTime;
+    private Method method;
+    private Object object;
+    private String netErrorMsg;
+    private boolean isCheckNet;
+    private boolean isDoubleClick;
+
+    public ViewBindClickListener(Method method, Object object, String netErrorMsg, boolean isCheckNet, boolean isDoubleClick) {
+        this.method = method;
+        this.object = object;
+        this.netErrorMsg = netErrorMsg;
+        this.isCheckNet = isCheckNet;
+        this.isDoubleClick = isDoubleClick;
+    }
+
+    @Override
+    public void onClick(View v) {
+        long time = System.currentTimeMillis();
+        if (isCheckNet) {
+            //判断网络问题
+            PackageManager pm = v.getContext().getPackageManager();
+            boolean permission = (PackageManager.PERMISSION_GRANTED == pm.checkPermission("android.permission.ACCESS_NETWORK_STATE", v.getContext().getApplicationContext().getPackageName()));
+            if (!permission) {
+                Exception exception = new Exception("no android.permission.ACCESS_NETWORK_STATE.");
+                exception.printStackTrace();
+                return;
+            }
+            if (!NetUtil.networkAvailable(v.getContext())) {
+                Toast.makeText(v.getContext(), netErrorMsg, Toast.LENGTH_SHORT).show();
+                return;
+            }
+        }
+        if (isDoubleClick) {
+            long timeD = time - lastClickTime;
+            long times = 600;
+            if (0 < timeD && timeD < times) {
+                return;
+            }
+        }
+        lastClickTime = time;
+        method.setAccessible(true);
+        try {
+            method.invoke(object, v);
+        } catch (Exception e) {
+            try {
+                if (e instanceof IllegalArgumentException) {
+                    method.invoke(object);
+                } else {
+                    method.invoke(object, new Object[]{});
+                }
+            } catch (Exception e1) {
+                e1.printStackTrace();
+            }
+        }
+    }
+}