AndroidStudio中使用最新ButterKnife註解框架
阿新 • • 發佈:2019-02-17
之前瞭解和使用過另外一個比較流行的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。