美文网首页Java架构技术进阶
Android Studio实战之 ButterKnife 使用

Android Studio实战之 ButterKnife 使用

作者: 程就人生 | 来源:发表于2019-07-20 04:24 被阅读11次

    butterknife作为Android App开发中的一款利器,在Android Studio开发时,不得不使用它来简化开发任务的繁重,相比Android annotations,在性能上具有一定的优化。接下来,直奔主题,看看一款新建的app应用是如何使用butterknife的。

    环境

    Android Studio 3.4.1
    butterknife 10.0.0
    java版本为1.8

    第一步,新建立一个项目,也可以使用已有的项目,在这里为了方便演示,减少关联,新建了一个empty activity项目
    第二步,进行butterknife插件的安装,

    安装butterknife有两种方式,一种是通过file->structure->dependencies进行在线安装,另一种通过手动配置进行安装;这里采用手动配置;不管是哪种,最终还是要检查配置文件。
    1)在项目的build.gradle的dependencies增加

    classpath 'com.jakewharton:butterknife-gradle-plugin:10.1.0'
    

    2)在app的build.gradle的头部增加

    apply plugin: 'com.jakewharton.butterknife'
    

    3)在app的build.gradle的dependencies增加

    implementation 'com.jakewharton:butterknife:10.1.0'
    annotationProcessor 'com.jakewharton:butterknife-compiler:10.1.0'
    

    4)在app的build.gradle的android属性下,增加jdk的版本,否则容易报各种莫名的错误

    //指定jdk版本
        compileOptions {
            sourceCompatibility JavaVersion.VERSION_1_8
            targetCompatibility JavaVersion.VERSION_1_8
        }
    
    第三步,检验butterKnife是否能正常使用,修改activity的代码如下:
    import androidx.appcompat.app.AppCompatActivity;
    
    import android.os.Bundle;
    import android.util.Log;
    import android.widget.Toast;
    
    import butterknife.ButterKnife;
    import butterknife.OnClick;
    
    public class MainActivity extends AppCompatActivity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            //使用butterKnife进行绑定,很重要,不然click等等绑定事件不起作用
            ButterKnife.bind(this);
    
        }
    
        @OnClick(R.id.button) void click(){
            Log.i("aaaaaaaaaa","BBBBBBBBBBbbb");
            Toast.makeText(this, "bbbbb", Toast.LENGTH_SHORT).show();
        }
    }
    

    注意事项:
    绑定的事件,如果不起作用,就需要检查一下在onCreate方法里,是否使用ButterKnife进行绑定了,刚开始使用,容易遗漏。

    在这次配置中,失败了好几次,也找了网上的很多资料,都没有解决配置中失败的问题,无论是手动配置,还是配置文件Sync Now。

    使用9.1.0-rc1的版本时,本系统只支持9.1.0-rc2以上的版本;
    使用9.1.0-rc2的版本时,需要支持AndroidX,打开配置一看,是支持的呀?
    最后换了10.1.0的版本,又报错找不到等等,翻了很多资料,先把jdk的版本加一加吧,没想到,加了这个就好了,可以运行了。

    使用butterknife的好处,就是可以不用在xml文件中进行事件绑定,还可以在activity中直接对有id属性的控件进行各种操作,以注解的方式来简化操作。另外butterknife不是基于反射机制的,在翻译的时候就把代码生成,所以不影响性能,这是butterknife的一个优点。

    ButterKnife使用实例
    一、绑定事件

    @OnClick(R.id.fab)
    public void show(View view){
            Snackbar.make(view, "Replace with your own action",Snackbar.LENGTH_LONG)
                            .setAction("Action", null).show();
    }
    
    @OnItemSelected(R.id.list_view)
    void onItemSelected(int position) {
      // TODO ...
    }
    
    @OnItemSelected(value = R.id.maybe_missing, callback = NOTHING_SELECTED)
    void onNothingSelected() {
      // TODO ...
    }
    

    二、绑定视图

     @BindView(R.id.toolbar)
        Toolbar toolbar;
        @BindView(R.id.fab)
        FloatingActionButton fab;
    

    三、在activity、fragment、Adapter初始化的时候进行绑定操作
    activity的onCreate方法

     public class MainActivity extends AppCompatActivity {
    
        //绑定文本
        @BindView(R.id.title1) TextView title;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            //使用butterKnife进行绑定,很重要,不然click等等绑定事件不起作用
            ButterKnife.bind(this);
    
            //设置标题
            title.setText("标题");
        }
    

    Fragment的onCreateView方法

    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;
      }
    }
    

    Adapter中的ViewHolder方法

    public class MyAdapter extends BaseAdapter {
      @Override public View getView(int position, View view, ViewGroup parent) {
        ViewHolder holder;
        if (view != null) {
          holder = (ViewHolder) view.getTag();
        } else {
          view = inflater.inflate(R.layout.whatever, parent, false);
          holder = new ViewHolder(view);
          view.setTag(holder);
        }
    
        holder.name.setText("John Doe");
        // etc...
    
        return view;
      }
    
      static class ViewHolder {
        @BindView(R.id.title) TextView name;
        @BindView(R.id.job_title) TextView jobTitle;
    
        public ViewHolder(View view) {
          ButterKnife.bind(this, view);
        }
      }
    }
    

    常用注解:
    @BindViews
    绑定多个view id 为一个view的list变量 @BindViews({ R.id.first_name, R.id.middle_name, R.id.last_name }) List<EditText> nameViews;

    @BindView
    绑定一个view id为一个view变量@BindView(R.id.title) TextView title;

    @BindArray
    绑定String中的array数组 @BindArray(R.array.city)String[] citys;

    @BindBitmap
    绑定图片资源文件, @BindBitmap(R.mipmap.wifi) Bitmap bitmap;

    @BindBool
    绑定真假boolean @BindBool(R.bool.boor)

    @BindColor
    绑定颜色 @BindColor(R.color.red)

    @BindDimen
    绑定尺寸 @BindDimen(R.dimen.spacer) Float spacer;

    @BindDrawable
    绑定Drawable @BindDrawable(R.drawable.graphic) Drawable graphic

    @BindFloat
    绑定Float

    @BindInt
    绑定Int

    @BindString
    绑定一个String id为String变量, @BindString(R.string.app_name) String msg

    @BindAnim
    绑定动画

    @BindFont
    绑定字体文字

    绑定事件,一共有12个事件监听

    @OnClick
    点击事件

    @OnCheckedChanged
    选中,选中取消

    @OnEditorAction
    软键盘的功能按键

    @OnFocusChange
    焦点改变

    @OnItemClick
    Item被点击事件(注意这里有坑,如果item里面有Button等这些有点击的控件事件的,需要设置这些控件属性focusable为false)

    @OnItemLongClick
    tem长按,返回真则可以拦截onItemClick

    @OnItemSelected
    Item被选择事件

    @OnLongClick
    长按事件

    @OnPageChange
    页面改变事件

    @OnTextChanged
    EditText里面的文本变化事件

    @OnTouch
    触摸事件

    @Optional
    选择性注入,如果当前对象不存在,就会抛出一个异常,为了压制这个异常,可以在变量或者方法上加入一下注解,让注入变成选择性的,如果目标View存在,则注入, 不存在,则什么事情都不做。

    参考文档:
    http://jakewharton.github.io/butterknife/
    https://blog.csdn.net/qq_29924041/article/details/80538360

    微信扫一扫,关注一下

    相关文章

      网友评论

        本文标题:Android Studio实战之 ButterKnife 使用

        本文链接:https://www.haomeiwen.com/subject/zpbrlctx.html