1、ButterKnife使用方法
1.新建一个名为ButterKnife
的项目。
2.要使用ButterKnife,只需在gradle中添加依赖即可。即在Module的build.gradle
文件中的dependencies
下增加下面两句:
implementation 'com.jakewharton:butterknife-compiler:8.8.1'
annotationProcessor 'com.jakewharton:butterknife-compiler:8.8.1'
3.编写布局文件actiivty_main
代码,代码如下:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".MainActivity">
<TextView
android:id="@+id/id_tv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello world" />
<Button
android:id="@+id/id_btn1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Btn1" />
<Button
android:id="@+id/id_btn2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Btn2" />
</LinearLayout>
1.1、注入TextView、Button、事件
MainActivity代码如下:
public class MainActivity extends AppCompatActivity {
@BindView(R.id.id_tv)
TextView mTv;
@BindView(R.id.id_btn1)
Button mBtn1;
@BindView(R.id.id_btn2)
Button mBtn2;
@BindString(R.string.app_name)
String str;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ButterKnife.bind(this);
mTv.setText(str);
}
@OnClick({R.id.id_btn1,R.id.id_btn2})
public void btnClick(View view){
switch (view.getId()) {
case R.id.id_btn1:
Toast.makeText(this, "Button1 clicked", Toast.LENGTH_SHORT).show();
break;
case R.id.id_btn2:
Toast.makeText(this, "Button2 clicked", Toast.LENGTH_SHORT).show();
break;
}
}
}
我们平时定义控件对象都是用private修饰符,这里却没有,这是由于如果使用ButterKnife对View进行注入的话,这些View的修饰符是不能用private来修饰的,如在TextView前面加上private修饰符,则会在Build窗口报如下图所示错误。
1.2、注入ListView
1.新建一个空的Activity,名为CategoryActivity
,并默认创建布局文件,在activity_category
中添加一个ListView。
<ListView
android:id="@+id/listview"
android:layout_width="match_parent"
android:layout_height="match_parent" />
2.首先新建一个类CategoryAdapter
并继承自ArrayAdapter
,代码如下:
public class CategoryAdapter extends ArrayAdapter<String> {
private LayoutInflater mLayoutInflater;
public CategoryAdapter(@NonNull Context context, @NonNull List<String> objects) {
super(context, -1, objects);
mLayoutInflater = LayoutInflater.from(context);
}
@NonNull
@Override
public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
ViewHolder holder = null;
if (convertView == null) {
convertView = mLayoutInflater.inflate(R.layout.item_category, parent, false);
holder = new ViewHolder(convertView);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
holder.mTextView.setText(getItem(position));
return convertView;
}
static class ViewHolder {
@BindView(R.id.tvTitle)
TextView mTextView;
ViewHolder(View view){
ButterKnife.bind(this, view);
}
}
}
3.这里编写CategoryAdapter
还需编写一个布局文件,新建一个item_category
布局文件:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="54dp"
android:orientation="vertical">
<TextView
android:id="@+id/tvTitle"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center_vertical" />
</LinearLayout>
4.继续编写CategoryActivity
代码,并将CategoryActivity
在AndroidManifest
中设置为启动页面。
public class CategoryActivity extends AppCompatActivity {
@BindView(R.id.listview)
ListView mListView;
private List<String> mData = new ArrayList<>(Arrays.asList("Simple Use", "RecyclerView Use"));
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_category);
ButterKnife.bind(this);
mListView.setAdapter(new CategoryAdapter(this, mData));
}
@OnItemClick(R.id.listview)
public void itemClicked(int position) {
Toast.makeText(this, "position:" + position, Toast.LENGTH_SHORT).show();
}
}
4.运行项目,后略。
1.3、注入RecycleView
1.在Module的build.gradle
文件中的dependencies
下添加RecyclerView依赖:
这里写代码片
2.新建一个空的Activity,名为RecyclerViewActivity
,在布局文件中添加一个RecyclerView
控件。
<android.support.v7.widget.RecyclerView
android:id="@+id/recyclerview"
android:layout_width="match_parent"
android:layout_height="match_parent" />
3.新建一个Adapter类名为RvAdapter
,代码如下:
public class RvAdapter extends RecyclerView.Adapter<RvAdapter.ViewHolder> {
private LayoutInflater mLayoutInflater;
private List<String> mDatas;
public RvAdapter(Context context, List<String> datas) {
mLayoutInflater = LayoutInflater.from(context);
mDatas = datas;
}
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
return new RvAdapter.ViewHolder(mLayoutInflater.inflate(R.layout.item_category, parent, false));
}
@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
holder.mTextView.setText(mDatas.get(position));
}
@Override
public int getItemCount() {
return mDatas.size();
}
static class ViewHolder extends RecyclerView.ViewHolder {
@BindView(R.id.tvTitle)
TextView mTextView;
private ViewHolder(View itemView) {
super(itemView);
ButterKnife.bind(this, itemView);
}
}
}
4.修改RecyclerViewActivity
代码:
public class RecyclerViewActivity extends AppCompatActivity {
@BindView(R.id.recyclerview)
RecyclerView mRecyclerView;
private List<String> mData = new ArrayList<>(Arrays.asList("RecyclerView 1", "RecyclerView 2"));
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_recycler_view);
ButterKnife.bind(this);
mRecyclerView.setAdapter(new RvAdapter(this, mData));
mRecyclerView.setLayoutManager(new LinearLayoutManager(this));
}
}
5.修改CategoryActivity
的itemClicked
方法,代码如下:
@OnItemClick(R.id.listview)
public void itemClicked(int position) {
Intent intent = null;
switch (position) {
case 0:
intent = new Intent(this, MainActivity.class);
startActivity(intent);
break;
case 1:
intent = new Intent(this, RecyclerViewActivity.class);
startActivity(intent);
break;
}
}
6.运行应用,后略。
2、ButterKnife Zelezny插件的学习
2.1、插件的安装
在 Android Studio: 打开设置(Ctrl+Alt+S) Settings → Plugins → Browse repositories 然后输入搜索框ButterKnife Zelezny
,点击安装然后按照提示重启Android Studio即可。
记住,一定要重启Android Studio
2.2、插件的使用
2.2.1、简单使用
将鼠标放在布局文件上,然后右键点击Generate
选项,然后选择Generate Butterknife Injections
。如下图所示,勾选相应的选项,这样就可以让我们从大量的findViewById()
和setonclicktListener()
解放出来。
下面现将之前的三个控件的绑定删除,操作如下(记着将鼠标放置在布局文件上然后再操作)。
2.2.2、在Adapt而中的使用
在Adapter中可以帮助我们生成ViwHolder。所以下面我们将之前的ViewHolder删除后再继续操作(在CategoryAdapter中进行操作)。
记住,要将鼠标放置与布局文件上进行操作