zoukankan      html  css  js  c++  java
  • Android注解框架实战-ButterKnife(原创)

    文章大纲

    1. Android注解框架介绍
    2. ButterKnife实战
    3. 项目源码下载
     

    一、框架介绍

    为什么要用注解框架?
      在Android开发过程中,我们经常性地需要操作组件,操作方法有findViewById, setOnClickListener等等方法,这个过程会让工程师抓狂的,好在市面已经有大神封装好的的注解框架可以帮助开发者简化一些过程,下面就让我来给大家介绍一些常见的注解框架。

    ButterKnife框架介绍
      首先看下Butterknife,来自Jakewharton大神的力作,特点是接入简单,依赖一个库就好了。另外在Android Studio上还有提供一个插件,自动生成注解与类属性。Butterknife目前支持的注解有: View绑定(Bind),资源绑定(BindBool, BindColor, BindDimen, BindDrawble, BindInt, BindString),事件绑定(OnCheckedChanged, OnClick, OnEditorAction, OnFocusChange, OnItemClick, OnItemLongClick, OnItemSelected, OnLongClick, OnPageChange, OnTextChanged, OnTouch),ButterKnife是在编译时候生成新的class文件,而不是在运行时处理这个逻辑,所以不影响使用性能。

    AndroidAnnotations框架介绍
      该框架的原理跟Butterknife一样,都是在编译时生成代码,不过annotations并不是生成代码供对应的类调用去给带注解的变量、方法赋值,而是直接生成一个继承带注解的类,这个类里面有对变量赋值,对注解方法调用的代码。运行时,直接运行的是annotations生成的类,而不是我们写的类。

    XUtils框架介绍
      xutils的使用方式跟Butterknife一样,都是在成员变量,方法上添加注释,然后调用一个方法(xutils是ViewUtils.inject()方法)对成员变量赋值、事件方法设置到view上。不同的是,Butterknife是调用自动生成的代码来赋值,而xutils是通过反射来实现的。

    温馨提示:

    1. 虽然现在的反射速度也很快了,但是还是不能跟原生代码相比,一旦注释用的多了,这初始化速度会越来越慢。通过上面注释处理的代码可以看出,xutils支持的注释目前主要有UI, 资源,事件,SharedPreference绑定。跟xutils一样是运行时利用反射去解析注释的框架还有afinal, roboguice等。
    2. 市面上还有很多其他的注释框架,但是万变不离其宗,不是反射就是自动生成代码。反射功能虽然强大,但是不可取,不仅会拖慢速度还会破话程序的封装性。个人认为生成代码的方案比较好,所有的功能都在编译时做了,并不会影响到用户的体验,唯一的缺点就是比反射难实现,不过我们程序不就是把难处留给自己,把快乐留给用户么!

    二、ButterKnife实战

    1. 添加xml布局

     

    2. 在app的build.gradle中添加以下依赖

     

    3. studio中下载插件

     
     
     

    温馨提示:下载后,一般studio会自动提示重启

    3. 添加ButterKnife声明

     

    温馨提示:
      Activity ButterKnife.bind(this);必须在setContentView();之后,且父类bind绑定后,子类不需要再bind。Fragment ButterKnife.bind(this, mRootView);这里的this不能替换成getActivity()。

    1. 获取组件并添加绑定关系
      右击布局,选择以下内容
       

    选择以下内容

     
     

    选择后自动生成以下代码:

     

    温馨提示:属性布局不能用private or static 修饰,否则会报错

    编译后运行程序,截图如下图所示:

     

    其他绑定方式介绍

    绑定注解
    @BindView---->绑定一个view;id为一个view 变量
    @BindView(R.id.tv_fm1)
    TextView tvFm1;
    @BindViews ---->绑定多个view;id为一个view的list变量
    @BindViews({ R.id.btn1,R.id.btn2 })
    List<Button> buttons;
    @BindArray---->绑定string里面array数组;
    @BindArray(R.array.city )
    String[] citys ;

    @BindBitmap---->绑定图片资源为Bitmap;
    @BindBitmap(R.mipmap.wifi )
    Bitmap bitmap;

    @BindBool ---->绑定boolean值

    @BindColor ---->绑定color;
    @BindColor(R.color.colorAccent)
    int black;

    @BindDimen ---->绑定Dimen;
    @BindDimen(R.dimen.borth_width)
    int mBorderWidth;

    @BindDrawable ----> 绑定Drawable;
    @BindDrawable(R.drawable.test_pic)
    Drawable mTestPic;

    @BindFloat ---->绑定float

    @BindInt ---->绑定int

    @BindString ---->绑定一个String id为一个String变量;
    @BindString(R.string.app_name )
    String meg;

    事件注解
    @OnClick---->点击事件
    @OnCheckedChanged ---->选中,取消选中
    @OnEditorAction ---->软键盘的功能键
    @OnFocusChange ---->焦点改变
    @OnItemClick item---->被点击(注意这里有坑,如果item里面有Button等这些有点击的控件事件的,需要设置这些控件属性focusable为false)
    @OnItemLongClick item---->长按(返回真可以拦截onItemClick)
    @OnItemSelected ---->item被选择事件
    @OnLongClick ---->长按事件
    @OnPageChange ---->页面改变事件
    @OnTextChanged ---->EditText里面的文本变化事件
    @OnTouch ---->触摸事件

    绑定view
    1)@BindView() : 布局id 注解
    @BindView( R2.id.button)
    public Button button;
    button 的修饰类型不能是:private 或者 static 。

    2)@BindViews(): 布局内多个控件 id 注解
    @BindViews({ R2.id.button1R2.id.button2R2.id.button3})
    public List<Button> buttonList ;
    ButterKnife.bind(this);
    buttonList.get( 0 ).setText( "hello 1 ");
    buttonList.get( 1 ).setText( "hello 2 ");
    buttonList.get( 2 ).setText( "hello 3 ");

    绑定资源
    1)@BindString() :绑定string 字符串
    @BindString(R2.string.app_name) //绑定资源文件中string字符串
    String str;
    button.setText( str );

    2)@BindArray() : 绑定string里面array数组
    @BindArray(R2.array.city) //绑定string里面array数组
    String [] citys ;
    button.setText(citys[0]);

    3)@BindBitmap( ) : 绑定Bitmap 资源
    @BindBitmap(R2.drawable.bm)//绑定Bitmap 资源
    public Bitmap bitmap ;
    imageView.setImageBitmap(bitmap);
    drawable文件夹下的图片使用R或R2引用都没问题;但是mipmap文件夹下的图片资源引用目前只能使用R

    4)@BindColor( ) : 绑定一个颜色值
    @BindColor( R2.color.colorAccent ) //具体色值在color文件中
    int black ; //绑定一个颜色值
    button.setTextColor( black );

    三、项目源码下载

    链接:https://pan.baidu.com/s/1it6GSMiigaZOhYm5q8yWYg
    提取码:iqdg

    参考文章:

      1. https://www.cnblogs.com/alexjie-123/p/6097523.html
      2. https://www.cnblogs.com/SongYongQian/p/7967202.html
  • 相关阅读:
    树莓派ZeroW的Python中使用SQLite数据库
    树莓派Python读写配置文件--configparser库
    信号量示例——“生产者——消费者”实验
    互斥锁示例——模拟银行卡取钱
    管道通信(上)
    命名管道——进程通信案例
    文件I/O
    链表习题
    蓝桥杯ACM训练Day4——算法2-8~2-11:链表的基本操作
    C++——类模板几种常见的情况
  • 原文地址:https://www.cnblogs.com/WUXIAOCHANG/p/10553962.html
Copyright © 2011-2022 走看看