註解框架ButterKnife

在系統當中安裝插件
File - Settings > Plugins 搜索Android ButterKnife Zelezny
安裝之後重啓AS
AndroidStudio中配置ButterKnife環境
1.在具體module下的.gradle文件中,添加如下語句
apply plugin: 'com.neenbedankt.android-apt'
添加在原有的apply plugin之下
在dependencies{}中添加
     apt 'com.jakewharton:butterknife-compiler:8.0.1'
       compile 'com.jakewharton:butterknife:8.0.1'
2.在工程的.gradle中添加
       classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'

Android Studio 3.0之後配置方法已經改變

//classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'

已經不需配置。

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

也不需要

//apt 'com.jakewharton:butterknife-compiler:8.2.1'

改爲

    annotationProcessor 'com.jakewharton:butterknife-compiler:8.8.1'

注意:

    compile 'com.jakewharton:butterknife:8.8.1'
    annotationProcessor 'com.jakewharton:butterknife-compiler:8.8.1'

這兩句當中的版本號必須要一致,否則會報以下錯誤

Error:(24, 36) error: cannot find symbol method findRequiredViewAsType(Object,int,String,Class<ImageView>)

使用:
Activity 中 控件及其相應的點擊事件
public class MainActivity extends AppCompatActivity {


    @BindView(R.id.buk_tv)
    TextView bukTv;
    @BindView(R.id.buk_btn)
    Button bukBtn;
    @BindView(R.id.buk_lv)
    ListView bukLv;

    private List<DataBean> data;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //layout處右擊或者Alt + Insert Generate ButterKnife Injections
        setContentView(R.layout.activity_main);
        //綁定Activity
        ButterKnife.bind(this);
        initListViewData();
    }

    private void initListViewData(){
        data = new ArrayList<>();
        for (int i = 0; i<6;i++){
            DataBean bean = new DataBean();
            bean.setTitle(getResources().getString(R.string.app_name)+i);
            bean.setContent(getResources().getString(R.string.app_name));
            data.add(bean);
        }
        bukLv.setAdapter(new TestAdapter(this,data));
    }

    @OnClick({R.id.buk_tv, R.id.buk_btn})
    public void onClick(View view) {
        switch (view.getId()) {
            case R.id.buk_tv:
                break;
            case R.id.buk_btn:
                Toast.makeText(this, R.id.buk_btn+"", Toast.LENGTH_SHORT).show();
                break;
        }
    }

    //注意:這個方法返回boolean類型
    @OnLongClick({R.id.buk_tv})
    public boolean onLongClick(View view){
        switch (view.getId()){
            case R.id.buk_tv:
                Toast.makeText(this, new Throwable().getStackTrace()[0].getMethodName(), Toast.LENGTH_SHORT).show();
                break;
        }
        return true;
    }

    @OnItemClick({R.id.buk_lv})
    public void onItemClick(int position){
        Toast.makeText(this, "你點擊的是第" + position + "條數據", Toast.LENGTH_SHORT).show();
    }

    //注意:這個方法返回boolean類型
    @OnItemLongClick({R.id.buk_lv})
    public boolean onItemLongClick(View view){
        Toast.makeText(this, "你要不要再按久點!", Toast.LENGTH_SHORT).show();
        return true;
    }
}


Adapter 中 ViewHolder的生成 以及相應的getView方法

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 position) {
        return datas.get(position);
    }

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

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder holder;
        if (convertView == null) {
            //Alt+Insert Generate ButterKnife Injections
            convertView = LayoutInflater.from(mContext).inflate(R.layout.item, null);
            holder = new ViewHolder(convertView);
            convertView.setTag(holder);
        }else {
            holder = (ViewHolder)convertView.getTag();
        }

        holder.itemTitle.setText(datas.get(position).getTitle());
        holder.itemContent.setText(datas.get(position).getContent());
        return convertView;
    }

    class ViewHolder {
        @BindView(R.id.item_title)
        TextView itemTitle;
        @BindView(R.id.item_content)
        TextView itemContent;

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


注意:

1. 注入的控件View或事件注入比如 onclick時,變量或方法的修飾符不能是private 和 static的。 
2. 比如ListView的長按事件@OnLongClick對應的方法返回是boolean類型,即不同的方法寫法是不完全相同的。 
3. 我們在adapter中使用註解時,一般是在ViewHolder的構造方法中傳入View對象,並且要調用ButterKnife.bind(this, v)方法綁定對應View。

發佈了35 篇原創文章 · 獲贊 11 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章