10、ButterKnife-Android强化课程笔记

1、ButterKnife使用方法

1.新建一个名为ButterKnife的项目。
2.要使用ButterKnife,只需在gradle中添加依赖即可。即在Module的build.gradle文件中的dependencies下增加下面两句:

参考地址:http://jakewharton.github.io/butterknife/

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代码,并将CategoryActivityAndroidManifest中设置为启动页面。

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.修改CategoryActivityitemClicked方法,代码如下:

@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插件的学习

参考地址:https://github.com/avast/android-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中进行操作)。

记住,要将鼠标放置与布局文件上进行操作
这里写图片描述

猜你喜欢

转载自blog.csdn.net/chaixingsi/article/details/81319041