ButterKnife

ButterKnife的使用

11/12/2017 11:21:52 PM

前言

源码地址:ButterKnifeDemo

这是一种依赖注入框架,当然是为了我们更好的便捷开发,当然这只是一个控件级别的注入框架,需要对象类型的话请使用Dagger2,这是jackWharton Google大神写的软件,在使用的过程中我们还能学学人家是怎么样写代码的(Adapter里的ViewHolder绑定问题).代码将更加的清晰可读性更好.

一.使用其中的一些技巧

建立build,相应的版本请参见github:

dependencies {
    testCompile 'junit:junit:4.12'
    annotationProcessor 'com.jakewharton:butterknife-compiler:8.8.1'
}

1.1 配合插件使用

Android ButterKnife Zelezny,安装之后重启即可,使用方法,在layout文件上:Fn + alt + Insert –> Generate –> Generate ButterKnife Injections,可选择性的生成,可更改名称

1.2 每一个新建的moudle中都自动有ButterKnife

在AndroidStudio\plugins\android\lib\templates\gradle-projects\NewAndroidModule\recipe.xml.ftl中添加如下代码,以后新创建的工程默认会添加Butterknife依赖:

<dependency mavenUrl="com.jakewharton:butterknife:7.0.1" />

二.Activity,Fragment,Adapter三大块中的使用

2.1 Activity

这个使用比较简单了,直接贴代码即可:

XMl:

<?xml version="1.0" encoding="utf-8"?>
<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="com.u9time.butterknife.MainActivity">

    <LinearLayout
        android:id="@+id/ll"
        android:layout_width="match_parent"
        android:layout_height="50dp">

        <Button
            android:id="@+id/btn_1"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="btn_1" />

        <Button
            android:id="@+id/btn_2"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="btn_2" />

        <Button
            android:id="@+id/btn_3"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="btn_3" />

        <Button
            android:id="@+id/btn_4"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="btn_4" />
    </LinearLayout>

    <android.support.v4.view.ViewPager
        android:id="@+id/vp"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

</LinearLayout>

Activity

package com.u9time.butterknife;

import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.view.ViewPager;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.LinearLayout;

import java.util.ArrayList;

import butterknife.BindArray;
import butterknife.BindString;
import butterknife.BindView;
import butterknife.ButterKnife;
import butterknife.OnClick;

public class MainActivity extends AppCompatActivity {

    @BindView(R.id.btn_1)
    Button btn1;
    @BindView(R.id.btn_2)
    Button btn2;
    @BindView(R.id.btn_3)
    Button btn3;
    @BindView(R.id.btn_4)
    Button btn4;
    @BindView(R.id.ll)
    LinearLayout ll;
    @BindView(R.id.vp)
    ViewPager vp;

    /**
     * 有很多的额绑定,可以是字符串,数组,颜色,图片等等.
     */
    @BindString(R.string.hello_blank_fragment)
    String hello_blank_fragment;
    @BindArray(R.array.city)
    String[] city;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ButterKnife.bind(this);

        initView();
    }

    private void initView() {
        ArrayList<Fragment> fragmentArrayList = new ArrayList<>();
        for (int i = 0; i < 3; i++) {
            fragmentArrayList.add(new BlankFragment());
        }
        vp.setAdapter(new VpAdapter(getSupportFragmentManager(), fragmentArrayList));
    }

    @OnClick({R.id.btn_1, R.id.btn_2, R.id.btn_3, R.id.btn_4, R.id.ll})
    public void onViewClicked(View view) {
        switch (view.getId()) {
            case R.id.btn_1:
                break;
            case R.id.btn_2:
                break;
            case R.id.btn_3:
                break;
            case R.id.btn_4:
                break;
            case R.id.ll:
                break;
        }
    }
}

2.2 Fragment

其中需要注意是

ButterKnife.bind(this, view)

代码XMl:

<FrameLayout 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"
tools:context="com.u9time.butterknife.BlankFragment">

    <ListView
        android:id="@+id/listview"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

</FrameLayout>

Fragment:

package com.u9time.butterknife;

import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ListView;

import butterknife.BindView;
import butterknife.ButterKnife;
import butterknife.Unbinder;

public class BlankFragment extends Fragment {


    @BindView(R.id.listview)
    ListView listview;
    Unbinder unbinder;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_blank, container, false);
        unbinder = ButterKnife.bind(this, view);
        return view;
    }

    @Override
    public void onActivityCreated(@Nullable Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);

        String[] data = new String[50];
        for (int i = 0; i < 50; i++) {
            data[i] = String.valueOf(i);
        }
        listview.setAdapter(new LsAdapter(getContext(),data));
    }

    @Override
    public void onDestroyView() {
        super.onDestroyView();
        unbinder.unbind();
    }
}

2.3 Adapter

需要注意自己ViewHolder的写法

XMl:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">

    <TextView
        android:id="@+id/tv"
        android:layout_width="match_parent"
        android:layout_height="40dp"
        android:gravity="center" />

</LinearLayout>

Adapter:

package com.u9time.butterknife;

import android.content.Context;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;

import butterknife.BindView;
import butterknife.ButterKnife;

/**
 * Created by Lenovo on 2017/11/12.
 */

class LsAdapter extends BaseAdapter {
    private Context context;
    private String[] data;

    public LsAdapter(Context context, String[] data) {
        this.context = context;
        this.data = data;
    }

    @Override
    public int getCount() {
        return data.length;
    }

    @Override
    public Object getItem(int position) {
        return data[position];
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {

        ViewHolder holder;

        if (convertView == null) {
            convertView = View.inflate(context, R.layout.ls_item, null);
            holder = new ViewHolder(convertView);
            convertView.setTag(holder);
        } else {
            holder = (ViewHolder) convertView.getTag();
        }

        holder.setData(data[position]);

        return convertView;
    }

    static class ViewHolder {
        @BindView(R.id.tv)
        TextView tv;
        private String data;

        ViewHolder(View view) {
            ButterKnife.bind(this, view);
        }

        public void setData(String data) {
            this.data = data;

            tv.setText(data);
        }
    }
}

三.主次要点

这个仅仅只是一种注释框架并不属于真真的核心技术,当然不可否认确实很厉害,但是我们一般只是用作来注入控件和点击事件的,其他的数组及字符串等可只作为了解内容.

总结

只是工具,会用即可.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值