1. 程式人生 > >AndroidStudio中使用最新ButterKnife註解框架

AndroidStudio中使用最新ButterKnife註解框架

之前瞭解和使用過另外一個比較流行的Android註解開源框架AndroidAnnotions,其功能也非常強大,使用比較方便,唯一的不足就是要在專案AndroidManifest.xml中為Activity配置對應的Activity_類。
我們把AndroidAnnotions和ButterKnife簡單地比較下:
  • AndroidAnnotions利用註解方式簡化程式碼,提高開發效率,但是相對於ButterKnife配置麻煩點。其通過反射機制註解,佔用記憶體資源相對較多,也比較耗時。
  • ButterKnife配置和使用都非常方便,通過View注入繫結進行註解提升開發效率,執行時也不會影響APP效率。

—-第一步:AndroidStudio中配置ButterKnife環境——
1,在專案mode對應的.gradle檔案頂部中新增:

apply plugin: 'com.neenbedankt.android-apt'

及在dependencies{}中新增:

    apt 'com.jakewharton:butterknife-compiler:8.0.1'
    compile 'com.jakewharton:butterknife:8.0.1'

我專案的配置如下:

apply plugin: 'com.android.application'
apply plugin: 'com.neenbedankt.android-apt'
android { compileSdkVersion 24 buildToolsVersion "23.0.3" defaultConfig { applicationId "com.ldm.bufferknife" minSdkVersion 15 targetSdkVersion 24 versionCode 1 versionName "1.0" } buildTypes { release { minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } } dependencies { compile fileTree(include: ['*.jar'], dir: 'libs') apt 'com.jakewharton:butterknife-compiler:8.0.1' compile 'com.jakewharton:butterknife:8.0.1' compile 'com.android.support:appcompat-v7:24.0.0' }

2,在工程中的.gradle檔案中dependencies {}新增classpath ‘com.neenbedankt.gradle.plugins:android-apt:1.8’,結果如下:

 dependencies {
        classpath 'com.android.tools.build:gradle:2.1.2'
        classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'
    }

—註解程式碼之:Activity中使用註解——-

/**
 * @param
 * @author ldm
 * @description Android註解框架:ButterKnife使用簡介
 * @time 2016/7/4 9:07
 */
public class MainActivity extends Activity {
    //通過@BindView()繫結控制元件。以前版本用@InjectView()來繫結控制元件,現在是用@BindView繫結控制元件
    @BindView(R.id.buk_textview)
    TextView buk_textview;
    @BindView(R.id.buk_btn)
    Button buk_btn;
    @BindView(R.id.buk_listview)
    ListView buk_listview;
    private List<DataBean> datas;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //以前用的是ButterKnife.inject()來繫結Activity,現在用的是ButterKnife.bind(),版本不同相應的方法不同
        ButterKnife.bind(MainActivity.this);
        //接下來就可以直接使用我們已經繫結好的控制元件
        initListViewData();
    }

    private void initListViewData() {
        datas = new ArrayList<>();
        for (int i = 0; i <= 6; i++) {
            DataBean bean = new DataBean();
            bean.setTitle("這是標題" + i);
            bean.setContent("內容暫時都一樣吧");
            datas.add(bean);
        }
        buk_listview.setAdapter(new TestAdapter(this, datas));
    }

    //通過ButterKnife對控制元件的監聽事件進行處理
    //註解繫結Button的點選事件
    @OnClick(R.id.buk_btn)
    public void buttonClick() {
        Toast.makeText(this, "不許再點我!", Toast.LENGTH_SHORT).show();
    }

    //ListView的item點選事件
    @OnItemClick(R.id.buk_listview)
    public void onitemClick(int pos) {//點選事件
        Toast.makeText(this, "你點選的是第" + pos + "條資料", Toast.LENGTH_SHORT).show();
    }

    //ListView的item長按監聽事件
    @OnItemLongClick(R.id.buk_listview)
    public boolean onLongClick(View view) {//注意:這個方法返回boolean型別
        Toast.makeText(this, "你要不要再按久點!", Toast.LENGTH_SHORT).show();
        return true;
    }
}

—–註解程式碼之:Adapter中使用註解—–

/**
 * description:Adapter中使用ButterKnife註解
 * 作者:ldm
 * 時間:20162016/7/4 10:25
 */
public class TestAdapter extends BaseAdapter {
    private Context mContext;
    private List<DataBean> datas;

    public TestAdapter(Context mContext, List<DataBean> datas) {
        this.mContext = mContext;
        this.datas = datas;
    }

    @Override
    public int getCount() {
        return datas.size();
    }

    @Override
    public Object getItem(int i) {
        return datas.get(i);
    }

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

    @Override
    public View getView(int i, View view, ViewGroup viewGroup) {
        ViewHolder holder;
        if (view == null) {
            view = LayoutInflater.from(mContext).inflate(R.layout.item, null);
            holder = new ViewHolder(view);
            view.setTag(holder);
        } else {
            holder = (ViewHolder) view.getTag();
        }
        holder.item_title.setText(datas.get(i).getTitle());
        holder.item_content.setText(datas.get(i).getContent());
        return view;
    }

    class ViewHolder {
        @BindView(R.id.item_title)//在Adapter中通過註解繫結控制元件
                TextView item_title;
        @BindView(R.id.item_content)
        TextView item_content;

        public ViewHolder(View v) {
            ButterKnife.bind(this, v);//註解繫結View
        }
    }
}

—-i測試資料用到的實體類——

/**
 * description:
 * 作者:ldm
 * 時間:20162016/7/4 10:29
 */
public class DataBean implements Serializable {
    private String title;
    private String content;

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public String getContent() {
        return content;
    }

    public void setContent(String content) {
        this.content = content;
    }
}

使用中發現了幾個小注意點:
1. 注入的控制元件View或事件注入比如 onclick時,變數或方法的修飾符不能是private 和 static的。
2. 比如ListView的長按事件@OnLongClick對應的方法返回是boolean型別,即不同的方法寫法是不完全相同的。
3. 我們在adapter中使用註解時,一般是在ViewHolder的構造方法中傳入View物件,並且要呼叫ButterKnife.bind(this, v)方法繫結對應View。