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>)
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。