Android框架之路——ButterKnife的使用

来源:互联网 发布:洗澡心脏难受知乎 编辑:程序博客网 时间:2024/06/17 13:28

一、简介:

ButterKnife是注解中相对简单易懂的很不错的开源框架。
1. 强大的View绑定和Click事件处理功能,简化代码,提升开发效率;
2. 方便的处理Adapter里的ViewHolder绑定问题;
3. 运行时不会影响APP效率,使用配置方便;
4. 代码清晰,可读性强。

二、使用步骤:

  • 安装ButterKnife插件,可以参考:Android Studio安装ButterKnife插件
  • 在Project的build.gradle中添加:

    dependencies {    classpath 'com.android.tools.build:gradle:2.2.3'    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}
  • 在app的build.gradle文件中添加

    apply plugin: 'com.android.application'apply plugin: 'com.neenbedankt.android-apt'  //添加的......dependencies {    .........    compile 'com.jakewharton:butterknife:8.1.0'    //添加的    apt 'com.jakewharton:butterknife-compiler:8.1.0'   //添加的}

三、解锁技能:

  1. 省略findViewById()

    1. 在Activity中使用

      • 曾经的我们:

        mTextView1 = (TextView) findViewById(R.id.tv_1);
      • 如今的我们:

        @BindView(R.id.butter_text_view_2)TextView mTextView2;
      • 值得注意的:View变量声明的时候不能为private或者static,在设置好布局之后调用:ButterKnife.inject(this)。一般也没什么关系,我们都是在布局文件位置进行Generate自动插件帮助生成的。
    2. 在Fragment中使用
      同样在加载布局后调用ButterKnife.inject(this, view),多传递一个参数view。在控件上添加注解。@InjectView(R.id.fragment_text_view)即可正常使用。

      View view = inflater.inflate(R.layout.fragment_simple, container, false);ButterKnife.inject(this, view);@BindView(R.id.fragment_text_view)TextView mTextView;mTextView.setText("TextView in Fragment are found!");
    3. Adapter ViewHolder中使用
      在Adapter中,可以在构造函数内进行调用ButterKnife.inject(this, view),同样在控件声明上方进行注解。

      static class ViewHolder {    @BindView(R.id.person_name)    TextView name;    public ViewHolder(View view) {        ButterKnife.inject(this, view);    }}
  2. 省略setOnClickListener()

    • 曾经的我们:

      bt.setOnClickListener(new View.OnClickListener() {    @Override    public void onClick(View v) {        finish();    }});  
    • 如今的我们:

      @OnClick(R.id.basic_finish_a_button)void finishA(View view) {    finish();}
    • 值得注意的:注意这里方法仍然不能是private和static, 并且可以有一个参数View,也可不写。
  3. 一些控件的特殊可以监听的方法
    • ListView的点击OnItemClick
    • CheckBox的OnCheckedChanged
    • EditText加addTextChangedListener
      具体见Demo示例
  4. 同时为多个id,为多个View绑定同一个事件处理方法
          多个view的id要用{}包裹,“,”分隔。

    @OnClick({R.id.bt1, R.id.bt2, R.id.bt3, R.id.bt4})void editViewsClicked() {    Toast.makeText(this, "You click the Button!", Toast.LENGTH_SHORT).show();} 

四、Demo示例:

  1. 先上效果图:
             这里写图片描述          这里写图片描述
  2. MainActivity中一些使用:

    • 绑定View

      @BindView(R.id.tv_1)TextView mTv1;@BindView(R.id.tv_2)TextView mTv2;@BindView(R.id.tv_3)TextView mTv3;@BindView(R.id.bt1)Button mBt1;@BindView(R.id.bt2)Button mBt2;@BindView(R.id.bt3)Button mBt3;@BindView(R.id.cb1)CheckBox mCb1;@BindView(R.id.activity_main)LinearLayout mActivityMain;@Overrideprotected void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    setContentView(R.layout.activity_main);    ButterKnife.bind(this);}
    • 设置点击事件

      • 单个View绑定事件

        @OnClick(R.id.bt2)void jumpToSecondActivity() {    startActivity(new Intent(MainActivity.this, SecondActivity.class));}@OnClick(R.id.bt3)void jumpToOneFragment() {    FragmentManager fragmentManager = getSupportFragmentManager();    FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();    FirstFragment firstFragment = new FirstFragment();    fragmentTransaction.add(R.id.fl_container, firstFragment);    fragmentTransaction.commit();}
      • 多个View共同绑定一个事件

        @OnClick({R.id.bt1, R.id.tv_1})void click() {    Toast.makeText(MainActivity.this, "haha", Toast.LENGTH_SHORT).show();}
      • 监听checkBox的OnCheckedChanged方法

        @OnCheckedChanged(R.id.cb1)void checkBoxCheckedChanged(){    if(mCb1.isChecked())        Toast.makeText(MainActivity.this, "Checked", Toast.LENGTH_SHORT).show();    else        Toast.makeText(MainActivity.this, "unChecked", Toast.LENGTH_SHORT).show();}
  3. SecondActivity中的一些使用(RecyclerView):

    • SecondActivity.java,主要有一个RecyclerView。RecyclerView不支持onItemClick,所以Butterknife也没有了。

      public class SecondActivity extends AppCompatActivity {    @BindView(R.id.recyclerView)    RecyclerView mRecyclerView;    private List<String> mList = new ArrayList<>();    @Override    protected void onCreate(@Nullable Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_second);        ButterKnife.bind(this);        initData();        mRecyclerView.setAdapter(new RecyclerAdapter(mList, this));        mRecyclerView.setLayoutManager(new LinearLayoutManager(this));    }    private void initData() {        for (int i = 0; i < 30; i++)            mList.add(i + "");    }}
    • RecyclerAdapter中的绑定,和下面的Fragment中listview绑定还是非常相似的。

      public class RecyclerAdapter extends RecyclerView.Adapter<RecyclerAdapter.RecyclerViewHolder> {    private List<String> data;    private Context mContext;    public RecyclerAdapter(List<String> data, Context context) {        this.data = data;        mContext = context;    }    @Override    public RecyclerViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {        View view = LayoutInflater.from(mContext).inflate(R.layout.item_recycler, parent, false);        RecyclerViewHolder holder = new RecyclerViewHolder(view);        return holder;    }    @Override    public void onBindViewHolder(RecyclerViewHolder holder, int position) {        holder.mItemRecyclerTv.setText(data.get(position));    }    @Override    public int getItemCount() {        return data.size();    }    public class RecyclerViewHolder extends RecyclerView.ViewHolder {        @BindView(R.id.item_recycler_tv)        TextView mItemRecyclerTv;        public RecyclerViewHolder(View itemView) {            super(itemView);            ButterKnife.bind(this, itemView);        }    }}
  4. Fragment中使用:

    • FirstFragment中绑定ListView控件,利用@OnItemClick(R.id.listview)监听点击事件,方法中可以传递position参数。

      public class FirstFragment extends Fragment {    @BindView(R.id.listview)    ListView mListview;    Unbinder unbinder;    private List<String> mList = new ArrayList<>();    @Nullable    @Override    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {        View view = inflater.inflate(R.layout.fragment_first, container, false);        unbinder = ButterKnife.bind(this, view);        initData();        mListview.setAdapter(new ListAdapter(getActivity(), mList));        return view;    }    private void initData() {        for (int i = 0; i < 30; i++)            mList.add(i + "");    }    @OnItemClick(R.id.listview)    void onListItemClick(int pos){        Toast.makeText(getActivity(), mList.get(pos), Toast.LENGTH_SHORT).show();    }    @Override    public void onDestroyView() {        super.onDestroyView();        unbinder.unbind();    }}
    • ListAdapter中inflate布局,butterknife可以自动为我们生成ViewHolder,剩下的和往常一样,复写Adapter的四个方法。

      public class ListAdapter extends BaseAdapter {    private List<String> data;    private Context mContext;    public ListAdapter(Context context, List<String> data) {        mContext = context;        this.data = data;    }    @Override    public int getCount() {        return data.size();    }    @Override    public Object getItem(int position) {        return data.get(position);    }    @Override    public long getItemId(int position) {        return position;    }    @Override    public View getView(int position, View convertView, ViewGroup parent) {        ViewHolder holder = null;        if(convertView == null){            convertView = View.inflate(mContext, R.layout.item_list, null);            holder = new ViewHolder(convertView);            convertView.setTag(holder);        }else {            holder = (ViewHolder) convertView.getTag();        }        holder.mItemRecyclerTv.setText(data.get(position));        return convertView;    }    static class ViewHolder {        @BindView(R.id.item_recycler_tv)        TextView mItemRecyclerTv;        ViewHolder(View view) {            ButterKnife.bind(this, view);        }    }}

五、Demo下载:

       源码链接


个人公众号:每日推荐一篇技术博客,坚持每日进步一丢丢…欢迎关注,想建个微信群,主要讨论安卓和Java语言,一起打基础、用框架、学设计模式,菜鸡变菜鸟,菜鸟再起飞,愿意一起努力的话可以公众号留言,谢谢…

1 0
原创粉丝点击