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' //添加的}
三、解锁技能:
省略findViewById()
在Activity中使用
曾经的我们:
mTextView1 = (TextView) findViewById(R.id.tv_1);
如今的我们:
@BindView(R.id.butter_text_view_2)TextView mTextView2;
- 值得注意的:View变量声明的时候不能为private或者static,在设置好布局之后调用:ButterKnife.inject(this)。一般也没什么关系,我们都是在布局文件位置进行Generate自动插件帮助生成的。
在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!");
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); }}
省略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,也可不写。
- 一些控件的特殊可以监听的方法
- ListView的点击OnItemClick
- CheckBox的OnCheckedChanged
- EditText加addTextChangedListener
具体见Demo示例
同时为多个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示例:
- 先上效果图:
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();}
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); } }}
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语言,一起打基础、用框架、学设计模式,菜鸡变菜鸟,菜鸟再起飞,愿意一起努力的话可以公众号留言,谢谢…
- Android框架之路——ButterKnife的使用
- 【Android - 框架】之ButterKnife的使用
- Android框架之Butterknife的使用
- Android中的注解框架——butterknife的使用
- Android ButterKnife框架的使用
- Android Butterknife 框架源码解析(1)——ButterKnife的使用
- Android中的注解式框架之ButterKnife的使用
- Android 框架之ButterKnife
- Android ----- butterknife框架使用
- 软件框架之ButterKnife的使用
- Android注解框架(ButterKnife的简单使用)
- Android Butterknife 注解框架的使用
- android butterknife框架的简单使用
- Android——注释框架ButterKnife使用教程
- butterknife框架的使用
- ButterKnife框架的使用
- Android之butterknife使用
- 【Android】Android开发之著名框架ButterKnife的使用详解,butterknife8.1.0版本的使用方法
- hdu 5706 GirlCat
- Elasticsearch中常用的API
- java 动态代理
- 【学习笔记】Win安装虚拟环境virtualenv
- MySql之commit、rollback等事务控制命令
- Android框架之路——ButterKnife的使用
- FZU
- Java8新特性
- Oracle更新的多种场景
- 最小生成树的Kruskal算法java代码实现
- 类与类之间的几种关系
- Ngunx介绍
- 在Java项目中整合Scala
- Sql Server的作业实现 (任务调度)