zoukankan      html  css  js  c++  java
  • 玩转ButterKnife注入框架

    在去年这个时候,我写过一篇介绍Android注解的文章android注解使用详解,这篇文章主要是介绍了Android中的AndroidAnnotations注入框架,AA框架有它自身的一些优点,这里不赘述,但是我总觉得和ButterKnife比起来来世有些差距,今天我们就来看看ButterKnife的正确使用姿势,结合AndroidStudio中ButterKnife的插件,你会发现ButterKnife用起来有多爽!

    本文主要包含以下几方面内容:

    1.引入框架

    2.普通控件实例化

    3.绑定点击事件

    4.资源实例化

    5.ListView中item控件实例化

    6.Fragment控件实例化

    7.控件的批量操作


    OK,那就开始吧!

    1.引入框架

    在Studio中使用ButterKnife还是非常方便的,引入ButterKnife:

    compile 'com.jakewharton:butterknife:8.2.1'

    这是目前最新的版本,和7.0的版本比起来使用上还是有一些变化的,那我们玩就玩最新的,那些老旧的版本就不管了。如果是8之前的版本引入这样一句话就够了,但是最新的版本除了这个还需要apt插件,引入方式如下,先修改你你projec的gradle文件变为如下样式:

    buildscript {
        repositories {
            jcenter()
        }
        dependencies {
            classpath 'com.android.tools.build:gradle:2.1.0'
            classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'
    
            // NOTE: Do not place your application dependencies here; they belong
            // in the individual module build.gradle files
        }
    }

    然后修改在你的Module的gradle文件中先添加如下一行,表示引用该该插件:

    apply plugin: 'android-apt'

    最后再来引入ButterKnife和这个插件即可:

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

    还没看明白?文末下载源码自行研究。

    2.普通控件实例化

    引入进来之后,我们就可以痛快的使用ButterKnife了,首先当时是先来尝试取消各种烦人的findViewById了,示例如下:

        //初始化TextView控件
        @BindView(R.id.tv1)
        TextView tv1;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            //绑定控件
            ButterKnife.bind(this);
            tv1.setText("Hello ButterKnife");
        }

    用木有觉得很爽呢?从此所有的控件都不用findViewById了,当然,我们还可以批量初始化控件:

    @BindViews({R.id.tv2,R.id.tv3})
        TextView[] tvs;

    可以批量操作一个控件数组,也可以批量操作一个控件集合。

    3.绑定点击事件

    使用了ButterKnife我们也可以进行点击事件的绑定,现在我们在给Activity中的Button设置点击事件的时候大多是在布局文件中添加onClick属性,这种方式适用于Activity却不适用Fragment,如果你想在Fragment中也这么方便的设置点击事件,ButterKnife毫无疑问是你最好的选择。如下:

    @OnClick(R.id.tv2)
        public void click1() {
            Toast.makeText(MainActivity.this, "111", Toast.LENGTH_SHORT).show();
        }

    使用ButterKnife进行事件绑定的时候对方法名和方法参数都没有要求,你可以随意写。也可以一次给多个控件绑定点击事件,如下:

    @OnClick({R.id.tv1,R.id.tv3})
        public void click2(View view) {
            switch (view.getId()) {
                case R.id.tv1:
                    Toast.makeText(MainActivity.this, "111", Toast.LENGTH_SHORT).show();
                    break;
                case R.id.tv3:
                    Toast.makeText(MainActivity.this, "333", Toast.LENGTH_SHORT).show();
                    break;
            }
        }

    爽吧!

    4.资源实例化

    ButterKnife除了控件的实例化之外,还可以进行资源实例化,主要包括res文件夹中的资源文件,如下:

    @BindColor(R.color.colorAccent)
        int tvBg;
        @BindString(R.string.app_name)
        String tvStr;
        @BindDrawable(R.mipmap.ic_launcher)
        Drawable tvDrawable;
        @BindDimen(R.dimen.activity_horizontal_margin)
        int tvMargin;

    资源的读取,从此也是一行代码解决。

    5.ListView中item控件实例化

    可能有小伙伴要问了,那如果在ListView中又该如何初始化Item中的控件呢?很简单,只需要稍微修改一下ViewHolder和getView方法即可,如下:

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            ViewHolder holder;
            if (convertView == null) {
                convertView = inflater.inflate(R.layout.item, parent, false);
                holder = new ViewHolder(convertView);
                convertView.setTag(holder);
            }else{
                holder = (ViewHolder) convertView.getTag();
            }
            holder.iv.setImageResource(R.mipmap.ic_launcher);
            holder.tv.setText(list.get(position));
            return convertView;
        }
    
        class ViewHolder {
            @BindView(R.id.tv)
            TextView tv;
            @BindView(R.id.iv)
            ImageView iv;
    
            public ViewHolder(View itemView) {
                ButterKnife.bind(this, itemView);
            }
        }

    完整代码文末自行下载。

    6.Fragment控件实例化

    Fragment中的控件实例化和Adapter中的基本一致,就是绑定的地方特别注意,来一个官方的Demo吧,我就不写了:

    public class FancyFragment extends Fragment {
      @BindView(R.id.button1) Button button1;
      @BindView(R.id.button2) Button button2;
    
      @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fancy_fragment, container, false);
        ButterKnife.bind(this, view);
        // TODO Use fields...
        return view;
      }
    }


    7.控件的批量操作

    ButterKnife中还有一个好玩的地方莫过于控件的批量操作,我们可以定义统一的行为,来设置给某一组控件,比如我想给我某一组的TextView修改背景颜色,可以定义如下行为:

    ButterKnife.Action<View> CHANGECOLOR = new ButterKnife.Action<View>() {
                @Override
                public void apply(@NonNull View view, int index) {
                    view.setBackgroundColor(Color.RED);
                }
            };

    使用方式如下:

    ButterKnife.apply(textViews, CHANGECOLOR);

    其中textViews是一个TextView的集合。

    如果你想给TextView设置不同的背景颜色,那么还可以这样来定义:

    ButterKnife.Setter<View,List<Integer>> CHANGECOLOR2 = new ButterKnife.Setter<View, List<Integer>>() {
                @Override
                public void set(@NonNull View view, List<Integer> value, int index) {
                    view.setBackgroundColor(value.get(index));
                }
            };

    使用方式如下:

    List<Integer> colors = new ArrayList<>();
            colors.add(Color.RED);
            colors.add(Color.GREEN);
            colors.add(Color.BLUE);
            ButterKnife.apply(textViews,CHANGECOLOR2,colors);

    8.相关插件

    在Studio中使用ButterKnife有一个非常好的插件,叫做:Android ButterKnife Zelezny,大家自行安装学习使用姿势。



    OK,这就是ButterKnife一个简单的使用。官方文档地址http://jakewharton.github.io/butterknife/


    本文案例下载:http://download.csdn.net/detail/u012702547/9602107



  • 相关阅读:
    1118诗名,诗词形式,类别实体导入
    1119飞花令句子,好友关系导入
    1116五言诗生成&古今地名标注与展示
    1120地点实体与事件实体导入
    1121实体导入总结
    1111诗人生平信息提取
    1114诗词收集&藏头诗生成&Snownlp正负情感分析
    1112全体诗人个人生平提取
    1113七言诗词收集与LSTM自动写诗
    WPF ListView DataGrid日期时间类型格式转换
  • 原文地址:https://www.cnblogs.com/qitian1/p/6461679.html
Copyright © 2011-2022 走看看