精华内容
下载资源
问答
  • 正式开始介绍之前,我们先来了解下注解是到底是什么? 注解 注解是一种可以添加到java代码中。类、方法、变量、参数、包都可以被注解注解对被注解的代码没有直接影响。 注解之所以起作用是因为在代码编译时会根据...

    正式开始介绍之前,我们先来了解下注解是到底是什么?

    注解

    注解是一种可以添加到java代码中。类、方法、变量、参数、包都可以被注解,注解对被注解的代码没有直接影响。

    注解之所以起作用是因为在代码编译时会根据相应的注解做对应的处理。

    定义注解

    注解使用关键字@interface进行定义的。

    @Documented
    @Retention(RetentionPolicy.CLASS)
    @Target({ElementType.METHOD, ElementType.PARAMETER, 
             ElementType.FIELD, ElementType.LOCAL_VARIABLE, 
             ElementType.ANNOTATION_TYPE, ElementType.PACKAGE})
    public @interface Nullable {
    }
    

    但是在定义注解时需要使用@Target等注解对注解进行注解。用来对注解进行定义的注解就是元注解

    元注解

    作用在其他注解的注解(或者说 元注解)是:

    • @Retention - 标识这个注解怎么保存,是只在代码中,还是编入class文件中,或者是在运行时可以通过反射访问。
    • @Documented - 标记这些注解是否包含在用户文档中。
    • @Target - 标记这个注解应该是哪种 Java 成员。
    • @Inherited - 标记这个注解是继承于哪个注解类(默认 注解并没有继承于任何子类)

    引用自维基百科——Java注解

    support.annotation

    OverView

    support.annotation是Google提供的注解库,与Android Studio内置的代码检查工具配合,注解可以帮助检测可能发生的问题,例如 null 指针异常和资源类型冲突等。

    Android Studio配置

    在Module的build.gradle中添加配置:

    implementation 'com.android.support:support-annotations:28.0.0'
    

    需要注意的是:如果您使用 appcompat 库,则无需添加 support-annotations 依赖项。因为 appcompat 库已经依赖注解库。

    Nullness注解

    添加 @Nullable 和 @NonNull 注解,以检查给定变量、参数或返回值的 nullness。@Nullable 注解指示可以为 null 的变量、参数或返回值,而 @NonNull 则指示不可为 null 的变量、参数或返回值。

    private void testNullness(@NonNull Context context){
    
    }
    

    资源注解

    验证资源类型可能非常有用,因为 Android 对资源(例如可绘制对象和字符串资源)的引用以整型形式传递。需要参数来引用特定类型资源(例如可绘制对象)的代码可以作为预计的引用类型 int 传入,不过实际将引用不同类型的资源,例如 R.string 资源。

    @StringRes      //字符串资源
    @IntegerRes     //整型资源
    @ArrayRes       //数组型资源
    @BoolRes        //布尔型资源
    //...
    @FontRes        //字体资源
    @InterpolatorRes
    @ColorRes       //颜色资源
    @DrawableRes    //Drawable资源
    @AnimatorRes    //动画资源
    @AnyRes         //任意资源
    

    可以用来对方法的参数指定资源类型:

    public void setColor(@ColorRes int color){
         //指定参数为Color型资源,若传递R.string型资源,则会提示错误
    }
    

    线程注解

    线程注解可以检查某个方法是否从特定类型的线程调用。

        @MainThread     //主线程
        @UiThread       //UI线程
        @WorkerThread   //工作线程
        @BinderThread   //
        @AnyThread      //任意线程
    

    值约束注解

    可以约束某个参数的取值范围,或者长度。

        @IntRange       //int范围
        @FloatRange     //float范围
        @Size           //检查集合、数组和字符串的长度,min=1,max=3,@size(3)
    

    例如:

        private int setAlpha(@IntRange(from = 0, to = 255) int alpha){return alpha;}
        private float setAlpha(@FloatRange(from = 0.0,to = 1.0) float alpha){return alpha;}
        private void setSize(@Size(3) int[] array){}            //参数长度为3
        private void setSize(@Size(min = 1) float[] array){}    //参数至少有一个元素
        private void setSize(@Size(max = 3) String[] array){}   //参数最多有三个元素
    

    权限注解

    检查该方法使用到的权限是否在权限列表中存在。

        @RequiresPermission     //权限注解, 
                                //anyOf 检查一组中的任意一个权限
                                //allOf 检查一组权限
    

    例如:

        @RequiresPermission(Manifest.permission.SET_WALLPAPER)
        public void setWallpaper() throws IOException{}
    
        @RequiresPermission(allOf = {
                Manifest.permission.READ_EXTERNAL_STORAGE,
                Manifest.permission.WRITE_EXTERNAL_STORAGE})
        public static final void copyFile(String dest, String source) {}
    

    返回值注解

    检查是否对方法的返回值进行处理,验证实际使用的是方法的结果还是返回值。
    例如:

        @CheckResult(suggest = "check(int pid)")
        public int check(int pid, int uid){return 0;}
    
        public void check(int pid){}
    

    Typedef 注解

    使用 @IntDef 和 @StringDef 注解,以便能够创建整型和字符串集的枚举注解来验证其他类型的代码引用。看代码更容易理解一些:

    //定义了两个常量
    public static final int REQUEST_TYPE_AQIYI = 0;
    public static final int REQUEST_TYPE_LOCAL = 1;
    
    //定义一个RequestType声明可接收的常量
    @IntDef({REQUEST_TYPE_AQIYI,REQUEST_TYPE_LOCAL})
    public @interface RequestType{}
    
    @RequestType
    public int getRequestType(){
        //返回值只能是REQUEST_TYPE_AQIYI和REQUEST_TYPE_LOCAL的其中一个
        //若不是则会生成警告
        return REQUEST_TYPE_AQIYI;
    }
    
    public void requestMovieData(@RequestType int type){
        //返回值只能是REQUEST_TYPE_AQIYI和REQUEST_TYPE_LOCAL的其中一个
        //若不是则会生成警告
    }
    

    本篇诸多描述引用自Android官方文档——使用注解改进代码检查有条件的小伙伴可以直接查看源文档,原文档描述更详细一些。

    转载于:https://my.oschina.net/zhongsm/blog/3021558

    展开全文
  • ButterKnife使用问题合集

    最近搞了一个包含几点解耦思路的Android示例工程 , 使用ButterKnife的时候碰到一些问题 , 在这里记录下来 , 也包括以后会碰到的问题.

    1. 问题 : 在Library中使用Butterknife时, bindview注解参数会报Attribute value must be constant. 

    ----原因是library中的R.id.xx 这个id值不是一个常量(static final 修饰的)

    我的解决方案 : 引入8.4.0版本的Butterknife :

    在主工程的build.gradle 添加两个classpath

    dependencies{
    	classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'
    	classpath 'com.jakewharton:butterknife-gradle-plugin:8.4.0'
    }
       在目标library的build.gradle添加两个plugin, 以及对butterknife的依赖

    apply plugin: 'com.jakewharton.butterknife'
    apply plugin: 'com.neenbedankt.android-apt'


    apt 'com.jakewharton:butterknife-compiler:8.4.0'
    compile 'com.jakewharton:butterknife:8.4.0'

        最后使用Butterknife gradle插件生成的R2类来绑定View

    @BindView(R2.id.id_demoText)
        TextView mTextView;

    2. 问题 : 引用 library中的Butterknife 绑定无效

            ----猜测是apt插件必须要在使用butterknife的module中声明 , 被依赖library的module只需要声明compile.

    我的解决方案 : 在使用Butterknife的module中引入

    apply plugin: 'com.neenbedankt.android-apt'
    dependencies {
        compile fileTree(dir: 'libs', include: ['*.jar'])
        apt 'com.jakewharton:butterknife-compiler:8.4.0'
        compile project(path: ':common')
    }
    在common模块中只用compile库就OK

    dependencies {
        compile 'com.jakewharton:butterknife:8.4.0'
    }
    原理的话对gradle研究的不多 , 以后再补上.


    另外附上示例项目的git地址 https://github.com/baoyin152/by_mvp-bus_app.git




         

    展开全文
  • Android注解:Android 常用注解

    千次阅读 2018-11-04 13:35:23
    Android注解:Android 常用注解 1 添加支持注解库依赖项2 运行代码检查3 Android常用注解 首先说一下在Android代码中使用注解的好处。使用注解向 Lint 之类的代码检查工具提供提示,帮助检测这些更细微的代码问题;...


    首先说一下在Android代码中使用注解的好处。使用注解向 Lint 之类的代码检查工具提供提示,帮助检测这些更细微的代码问题;还可以少写一些重复代码;使用注解还非常的方便等等。

    1 添加支持注解库依赖项

    支持注解库是 Android 支持库的一部分。要向您的项目添加注解,您必须下载支持存储库并向 build.gradle 文件中添加 support-annotations 依赖项。

    • 打开 SDK 管理器,方法是点击工具栏中的 SDK Manager 或者选择 Tools > Android > SDK Manager。
      点击 SDK Tools 标签。
      展开 Support Repository 并选中 Android Support Repository 复选框。
      点击 OK。
      继续安装向导的说明操作,安装软件包。
    • 将以下代码行添加到 build.gradle 文件的 dependencies 块中,向您的项目添加 support-annotations 依赖项:
      dependencies { compile 'com.android.support:support-annotations:24.2.0' }

    如果下载的库版本可能较高,因此,确保在此指定的值与第 3 步中的版本匹配。
    在显示的工具栏或同步通知中,点击 Sync Now。

    2 运行代码检查

    要从 Android Studio 启动代码检查(包含验证注解和自动 Lint 检查),请从菜单栏中选择 Analyze > Inspect Code。Android Studio 将显示冲突消息,在您的代码与注解冲突的地方标记潜在问题并建议可能的解决方法。

    3 Android常用注解

    3.1 Nullness 注解

    Nullness注解包括@Nullable @NonNull注解,以检查变量参数或者返回值的nullness。@Nullness表示可以为null;@NonNull表示不可以为null

    通过@Nullable标记的方法,如果使用其返回值不进行null的检查,则会出现警告。

    @Nullable
    public TextView getTextView(){
        return new TextView(this);
    }
    //使用
    getTextView().setVisibility(View.VISIBLE);
    

    在Android Studio中会报警告:Method invocation “setVisibility” may produce ‘java.lang.NullPointerException’…

    3.1.1 Nullness 分析

    Android Studio 支持通过运行 nullability分析,在您的代码中自动推断和插入 nullness注解。Nullability分析会在您代码的整个方法层次结构中扫描协定类,以检测:

    • 可返回 Null 的调用方法
    • 不会返回 Null 的方法
    • 可以为 Null 的变量,如字段、局部变量和参数
    • 不能为 Null 值的变量,如字段、局部变量和参数

    然后,此分析将自动在已检测到的位置插入相应的 null 注解。
    要在 Android Studio 中运行 nullability 分析,请选择 Analyze > Infer Nullity。Android Studio 会在代码中已检测到的位置插入 Android @Nullable 和 @NonNull 注解。运行 null 分析后,最好验证一下插入的这些注解。

    3.2资源注解

    验证资源类型可能非常有用,因为Android对资源(例如可绘制对象和字符串资源)的引用以整型形式传递。需要参数来引用特定类型资源(例如可绘制对象)的代码可以作为预计的引用类型 int 传入,不过实际将引用不同类型的资源,例如 R.string 资源。
    例如,添加 @StringRes 注解,以检查资源参数是否包含 R.string 引用,如下面所示:

    public abstract void setTitle(@StringRes int resId) {}
    

    在代码检查期间,如果参数中未传入 R.string 引用,注解将生成警告。
    常见的资源注解:

    @IntegerRes:R.integer 类型资源。
    @AnimatorRes:R.animator 类型资源。
    @AnimRes:R.anim 类型资源。
    @ArrayRes:R.array 类型资源。
    @AttrRes:R.attr 类型资源。
    @BoolRes:R.bool 类型资源。
    @ColorRes:R.color 类型资源。
    @DimenRes:R.dimen 类型资源。
    @DrawableRes:R.drawable 类型资源。
    @FractionRes:R.fraction 类型资源。(百分比)
    @IdRes:R.id 类型资源。
    @InterpolatorRes:R.interpolator 类型资源。(插值器)
    @LayoutRes:R.layout 类型资源。
    @MenuRes:R.menu 类型资源。
    @PluralsRes:R.plurals 类型资源。(复数)
    @RawRes:R.raw 类型资源。
    @StyleableRes:R.styleable 类型资源。
    @StyleRes:R.style 类型资源。
    @TransitionRes: R.transition 类型资源。
    @XmlRes:R.xml 类型资源。
    @AnyRes:未知资源。(表示自己不知道是什么类型的资源。比如有可能为 R.drawable 也有可能是 R.string。)

    可以使用相同的注解格式添加并在代码检查期间运行。如果您的参数支持多种资源类型,您可以在给定参数上添加更多注解
    @AnyRes 能够指示注解的参数可为任意类型的 R 资源。

    @ColorRes 与@ColorInt
    尽管您可以使用 @ColorRes 指定某个参数应为颜色资源,但是颜色整型(RRGGBB 或 AARRGGBB 格式)无法识别为颜色资源。请改用 @ColorInt 注解指示某个参数必须为颜色整型。构建工具会标记不正确代码,该代码会将颜色资源 ID(例如 android.R.color.black)而不是颜色整型传递到已注解方法。

    3.3 线程注解

    线程注解可以检查某个方法是否从特定类型的线程调用。支持以下线程注解

    • @MainThread
    • @UiThread
    • @WorkerThread
    • @BinderThread
    • @AnyThread

    注:1、构建工具会将 @MainThread 和 @UiThread 注解视为可互换,因此,您可以从 @MainThread 方法调用 @UiThread 方法,反之亦然。不过,如果系统应用在不同线程上带有多个视图,UI 线程可与主线程不同。因此,您应使用 @UiThread 标注与应用的视图层次结构关联的方法,使用 @MainThread 仅标注与应用生命周期关联的方法。
    2、WorkerThread 表示标记的方法只应该在工作线程上调用。如果标记的是一个类,那么该类中的所有方法都应是在一个工作线程上调用
    3、BinderThread 表示标记的方法只应在绑定线程上调用。如果标记的是一个类,那么该类中的所有方法都应是在绑定线程被调用

    3.4 值约束注解

    使用 @IntRange、@FloatRange 和 @Size 注解可以验证传递的参数的值。在应用到用户可能弄错其范围的参数时,@IntRange 和 @FloatRange 都非常有用。
    例:

    public void setAlpha(@IntRange(from=0,to=255) int alpha) {}
    public void setAlpha(@FloatRange(from=0.0, to=1.0) float alpha) {...}
    

    @Size 注解可以检查集合或数组的大小,以及字符串的长度。@Size 注解可用于验证以下质量:

    最小大小(例如 @Size(min=2))
    最大大小(例如 @Size(max=2))
    确切大小(例如 @Size(2))
    表示大小必须为此倍数的数字(例如 @Size(multiple=2))

    int[] location = new int[3];
    button.getLocationOnScreen(@Size(min=1) location);
    

    3.5 权限注解

    使用 @RequiresPermission 注解可以验证方法调用方的权限。

    @RequiresPermission(Manifest.permission.SET_WALLPAPER)
    public abstract void setWallpaper(Bitmap bitmap) throws IOException;
    
    @RequiresPermission(allOf = {
        Manifest.permission.READ_EXTERNAL_STORAGE,
        Manifest.permission.WRITE_EXTERNAL_STORAGE})
    public static final void copyFile(String dest, String source) {
        ...
    }
    

    要检查有效权限列表中是否存在某个权限,请使用 anyOf 属性。要检查是否存在一组权限,请使用 allOf 属性。上面的示例会标注 setWallpaper() 方法,以确保方法的调用方拥有 permission.SET_WALLPAPERS 权限;
    要求 copyFile() 方法的调用方同时具有外部存储空间的读写权限

    对于 intent 权限,请将权限要求添加到定义 intent 操作名称的字符串字段上:

    @RequiresPermission(android.Manifest.permission.BLUETOOTH)
    public static final String ACTION_REQUEST_DISCOVERABLE =
                "android.bluetooth.adapter.action.REQUEST_DISCOVERABLE";
    

    对于您需要单独读写权限的内容提供程序的权限,请在 @RequiresPermission.Read@RequiresPermission.Write注解中包含每个权限要求:

    @RequiresPermission.Read(@RequiresPermission(READ_HISTORY_BOOKMARKS))
    @RequiresPermission.Write(@RequiresPermission(WRITE_HISTORY_BOOKMARKS))
    public static final Uri BOOKMARKS_URI = Uri.parse("content://browser/bookmarks");
    

    间接权限

    如果权限依赖于提供给方法参数的特定值,请对参数本身使用 @RequiresPermission,而不用列出具体权限。例如, startActivity(Intent) 方法会对传递到方法的 intent 使用间接权限:

    public abstract void startActivity(@RequiresPermission Intent intent, @Nullable Bundle) {...}
    

    在您使用间接权限时,构建工具将执行数据流分析以检查传递到方法的参数是否具有任何 @RequiresPermission 注解。随后,它们会对方法本身强制参数的任何现有注解。在 startActivity(Intent) 示例中,当一个不具有相应权限的 intent 传递到方法时,Intent 类中的注解会针对 startActivity(Intent) 的无效使用生成警告,如图 1 中所示。

    此处输入图片的描述
    图 1. startActivity(Intent) 方法上从间接权限注解生成的警告。

    构建工具会在 startActivity(Intent) 上从 Intent 类中相应 intent 操作名称的注解生成警告:

    @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
    @RequiresPermission(Manifest.permission.CALL_PHONE)
    public static final String ACTION_CALL = "android.intent.action.CALL";
    

    如果需要,在标注方法的参数时,您可以将 @RequiresPermission 替换为 @RequiresPermission.Read 和/或 @RequiresPermission.Write。不过,间接权限 @RequiresPermission 不应与读取或写入权限注解搭配使用。

    3.6 CallSuper 注解

    使用 @CallSuper 注解可以验证替换方法是否会调用方法的超类实现。下面的示例会标注 onCreate() 方法,以确保任何替换方法实现都会调用 super.onCreate():

    @CallSuper
    protected void onCreate(Bundle savedInstanceState) {
    }
    

    3.7 Typedef 注解

    使用 @IntDef 和 @StringDef注解,能够创建整型和字符串集的 枚举 注解来验证其他类型的代码引用。
    Typedef 注解可以确保特定参数、返回值或字段引用特定的常量集。它们还可以完成代码以自动提供允许的常量。

    下面的示例说明了创建注解的具体步骤,此注解可以确保作为方法参数传递的值引用一个定义的常量:

    import android.support.annotation.IntDef;
    ...
    public abstract class ActionBar {
        ...
        // Define the list of accepted constants and declare the NavigationMode annotation
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({NAVIGATION_MODE_STANDARD, NAVIGATION_MODE_LIST, NAVIGATION_MODE_TABS})
        public @interface NavigationMode {}
    
        // Declare the constants
        public static final int NAVIGATION_MODE_STANDARD = 0;
        public static final int NAVIGATION_MODE_LIST = 1;
        public static final int NAVIGATION_MODE_TABS = 2;
    
        // Decorate the target methods with the annotation
        @NavigationMode
        public abstract int getNavigationMode();
    
        // Attach the annotation
        public abstract void setNavigationMode(@NavigationMode int mode);
    

    在您构建此代码时,如果 mode 参数不引用一个定义的常量(NAVIGATION_MODE_STANDARD、NAVIGATION_MODE_LIST 或 NAVIGATION_MODE_TABS),则会生成警告。

    您还可以组合 @IntDef 和 @IntRange,以指示整型可以是给定的常量集或某个范围内的值。

    允许将常量与标志相结合

    如果用户可以将允许的常量与标志(例如,|、& 和 ^,等等)相结合,则您可以通过 flag 属性定义一个注解,以检查某个参数或返回值是否会引用有效模式。下面的示例将使用一组有效的 DISPLAY_ 常量创建 DisplayOptions 注解:

    import android.support.annotation.IntDef;
    ...
    public static final int DISPLAY_USE_LOGO = 1;
    public static final int DISPLAY_SHOW_HOME = 2;
    public static final int DISPLAY_HOME_AS_UP= 4;
    public static final int DISPLAY_SHOW_TITLE= 8;
    public static final int DISPLAY_SHOW_CUSTOM =16;
    @IntDef(flag=true, value={
            DISPLAY_USE_LOGO,
            DISPLAY_SHOW_HOME,
            DISPLAY_HOME_AS_UP,
            DISPLAY_SHOW_TITLE,
            DISPLAY_SHOW_CUSTOM
    })
    @Retention(RetentionPolicy.SOURCE)
    public @interface DisplayOptions {}
    //使用
    @DisplayOptions int a= DISPLAY_USE_LOGO;
    @DisplayOptions int b= DISPLAY_SHOW_HOME;
    @DisplayOptions int c= a|b;
    

    在您使用注解标志构建代码时,如果经过修饰的参数或返回值不引用有效模式,则将生成警告。

    3.8 可访问性注解

    使用 @VisibleForTesting 和 @Keep 注解可以表示方法、类或字段的可访问性。

    @VisibleForTesting 注解指示一个代码块的可见性是否高于让代码变得可测试所需要的水平。

    @Keep 注解可以确保标记的指定代码在混淆时不会被混淆。它一般会添加到通过反射访问的方法和类中,以阻止编译器将代码视为未使用。

    参考资料:

    1. Android官方注解
    2. Android 中注解的使用
    展开全文
  • 在做android开发的时候,要控制界面的布局就需要根据View的id来做控制,然而id每次都需要 findViewById 来获取到View实例,这样写太麻烦了。...1、在 Module 的 build.gradle 里面添加View注解库 dependenc...

    在做android开发的时候,要控制界面的布局就需要根据View的id来做控制,然而id每次都需要 findViewById 来获取到View实例,这样写太麻烦了。于是,butterknife 的作用就体现出来了,它可以快速生成布局id注解,就不用每个控件都写 findViewById 了。

     

    1、在 Module 的 build.gradle 里面添加View注解库

    dependencies {
        //View注解库
        implementation 'com.jakewharton:butterknife:8.8.1'
        annotationProcessor 'com.jakewharton:butterknife-compiler:8.8.1'
    }

    添加好 butterknife 注解库之后就可以简单的运用了。

     

    2、初步运用

    例如,布局文件代码为:(可以看到其id为 materiel_color)

    <TextView
        android:id="@+id/materiel_color"
        style="@style/TextViewGray"
        android:text="546486"/>

    在Activity的 onCreate()方法中,绑定初始化 ButterKnife

    //绑定初始化ButterKnife
    ButterKnife.bind(this);

    绑定id

    @BindView(R.id.materiel_color)
    TextView materielColor;
    

    如上所示,就可以根据 materielColor 来操控这个 TextView 控件了,并不需要在使用 findViewById 来获取TextView实例

    上述的写法的代码都是需要手敲的,这样还是有些麻烦。但是,还有一个更简便的做法,我们只需要进行如下操作:

    3、我要偷懒

    想要偷懒,就还需要引入配套插件[android-butterknife-zelezny] 引入方法如下

    在项目内: File > Settings… > plugins     如下图所示

    如图所示,输入 ButterKnife Zelezny 搜索插件,如果本地有了,就直接勾选点击 OK ,如果没有就在这里直接下载下来。

     

    4、插件使用

    导入 ButterKnife Zelezny 插件后,就可以使用快捷键自动生成  @BindView 注解了

    在局部XML文件中写好必要的 id, 然后回到 Activity 界面,将鼠标放到 layout 布局文件上,如图所示

    鼠标右键 > Generate… > Generate Butterknife Injections 

    这时,在 Activity 上,就会生成该布局相关的 id 注解,这样就完成了布局上的所有 id 实例!

     

    5、在 Adapter 中使用 如下:

    @NonNull
    @Override
    public ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
        View view = LayoutInflater.from(context).inflate(R.layout.recycler_bad_history, null, false);
        ViewHolder viewHolder = new ViewHolder(view);
        return viewHolder;
    }

    同样在xml布局文件上按照第四步生成控件 id 实例

    class ViewHolder extends RecyclerView.ViewHolder {
    
        @BindView(R.id.creator)
        TextView creator;
        @BindView(R.id.checkMount)
        TextView checkMount;
        @BindView(R.id.ngNum)
        TextView ngNum;
        @BindView(R.id.ngContent)
        TextView ngContent;
        @BindView(R.id.createTim)
        TextView createTim;
        @BindView(R.id.materiel_image)
        ImageView materielImage;
    
        public ViewHolder(@NonNull View view) {
            super(view);
            ButterKnife.bind(this, view);
        }
    }

    将生成的控件 id 实例拷贝到 ViewHolder 中,在ViewHolder(@NonNull View view) 中手动添加ButterKnife.bind(this, view);

     

     

     

     

     

     

     

     

     

     

     

     

     

     

    展开全文
  • Android IOC注解库EasyUI

    2018-07-31 16:54:00
    1.使用反射机制和注解实现类似于butterknife的IOC框架 2.快速的findViewById和OnClick 3.扩展了click时无网络监测 4.扩展了快速点击监测 使用方法 1.引用 compile 'cn.cyq.android:easyuilibrary:1.1.0' 2.初始化...
  • Android 注解

    2017-08-11 16:35:00
    Android Support Library 专门推出注解库Support Annotation,各种开源函数也应用注解,例如REST网络请求。注解的定义 注解是java语言的特性之一,它是在源代码插入的标签,这些标签在后面的编译或者运行过程中起...
  • Android Support Annotations是从19.1版本引入的注解库,可优化代码,增加可读性,又可减少代码的报错 使用: 1:导包 implementation 'com.android.support:support-annotations:23.4.0' 2:Support Annotations...
  • 自定义Android注解:注解变量

    千次阅读 2018-08-02 12:35:34
    对于Android注解,或多或少都有一点接触,但相信大多数人都是在使用其它依赖的时候接触的。因为有些如果你想使用它就必须使用它所提供的注解。例如:ButterKnife、Dagger2、Room等等。 至于为何使用注解?使用...
  • ButterKnife是一个专注于Android系统的View注入框架,以前总是要写很多findViewById来找到View对象,有了ButterKnife可以很轻松的省去这些步骤。是大神JakeWharton的力作,目前使用很广。最重要的一点,使用...
  • Android注解收集

    2016-08-04 15:28:19
     Android support library从19.1版本开始引入了一个新的注解库,它包含很多有用的元注解,你能用它们修饰你的代码,帮助你发现bug。Support library自己本身也用到了这些注解,所以作为support library的用户,...
  • 对于Android注解,或多或少都有一点接触,但相信大多数人都是在使用其它依赖的时候接触的。因为有些如果你想使用它就必须使用它所提供的注解。例如:ButterKnife、Dagger2、Room等等。 至于为何使用注解?使用过...
  • 【版权申明】非商业目的可自由...现在Android开发中许多流行的第三方都使用了注解生成代码的方式,例如 ButterKnife, Dagger2,Glide等等,初次接触时感觉好神奇,后来感觉很实用,再后来想知道怎么实现的,再后来...
  • Android注解研习录

    2017-06-01 10:19:04
    而且,市面上产生了好多依赖注解而崛起的开源,Google官方更是为了Android而推出了Support Annotation。 如何定义注解 注解是Java引入的特性,通过在Java源代码中引入注解标签,可以在编译
  • android注解和反射的理解 刚开始使用butterknife的时候,觉得太爽了,为啥加个@bindview就不用写烦人的 findViewById了呢?然后还有EventBus、Retrofit现在很多都用到了注解, 现在来整理一下。还有处理运行时注解...
  • 一个简单的基于注解Android库,用于生成onActivityForResult处理程序

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 784
精华内容 313
热门标签
关键字:

android注解库