ButterKnife从严格意义讲不算是依赖注入框架,它只是专注于Android系统的View注入框架,并不支持其他方面的注入。它可以减少大量的findViewById以及setOnClickListener代码,简化代码并提升开发效率。
添加依赖
使用ButterKnife需要添加相应的依赖:
implementation "com.jakewharton:butterknife:10.2.3" annotationProcessor "com.jakewharton:butterknife-compiler:10.2.3"
在project/build.gradle中引入插件:
dependencies { classpath "com.android.tools.build:gradle:4.0.1" classpath 'com.jakewharton:butterknife-gradle-plugin:10.2.3' }
除此之外,还需要在app/build.gradle引入相应的插件id:
plugins { id 'com.android.application' id 'com.jakewharton.butterknife' }
绑定控件
用注解@BindView绑定控件id,代码如下所示:
public class MainActivity extends AppCompatActivity { @BindView(R.id.tv_text) TextView tvText; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ButterKnife.bind(this); tvText.setText("Bind View"); } }
用注解@BindViews绑定多个控件id,代码如下所示:
public class MainActivity extends AppCompatActivity { @BindViews({R.id.tv_text, R.id.tv_text1, R.id.tv_text2}) List<TextView> textViews; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ButterKnife.bind(this); for (int i = 0; i < textViews.size(); i++){ textViews.get(i).setText("Bind View" + i); } } }
绑定资源
可以用注解@BindString、@BindArray、@BindBool、@BindColor、@BindDimen、@BindDrawable和@BindBitmap。
@BindString(R.string.app_name) String appName; @BindArray(R.array.swordsman) String[] swordsman; @BindDimen(R.dimen.activity_horizontal_margin) float margin;
绑定监听
用@OnClick来对“点击事件”进行监听,同理也可以用@OnLongClick来对“长按点击事件”进行监听,如下所示:
public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ButterKnife.bind(this); } @OnClick(R.id.tv_text) public void onTextClick(View view){ Toast.makeText(this, "Bind Click Event", Toast.LENGTH_SHORT).show(); } @OnLongClick(R.id.tv_text) public void onTextLongClick(View view){ Toast.makeText(this, "Bind Long Click Event", Toast.LENGTH_SHORT).show(); } }
除此之外,还可以通过@OnTextChanged、@OnTouch、@OnItemClick等事件进行监听。
可选绑定
@BindView或者其他的注解操作符,如果不能找到目标资源,则会引发异常。为了防止异常,可以添加@Nullable注解:
@Nullable @BindView(R.id.tv_text) TextView tvName;
除了前面在Activity中使用ButterKnife之外,我们还可以在Fragment中使用它,如下所示:
public class BlankFragment extends Fragment { @BindView(R2.id.tv_text) TextView tvText; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View layout = inflater.inflate(R.layout.fragment_blank, container, false); ButterKnife.bind(this, layout); tvText.setText("Bind Text"); return layout; } }
在Adapter中我们也需要引用控件资源,也可以使用ButterKnife,如下所示:
public class RecycleAdapter extends RecyclerView.Adapter { private Context mContext; private List<String> mStrings; public RecycleAdapter(Context context, List<String> strings) { this.mContext = context; this.mStrings = strings; } @Override public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View view = LayoutInflater.from(mContext).inflate( R.layout.item_recycleview, parent, false); MyViewHold hold = new MyViewHold(view); return hold; } @Override public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { ((MyViewHold)holder).mTvContent.setText(mStrings.get(position)); } @Override public int getItemCount() { return mStrings.size(); } class MyViewHold extends RecyclerView.ViewHolder { @BindView(R.id.tv_item_content) TextView mTvContent; public MyViewHold(View itemView) { super(itemView); ButterKnife.bind(this, itemView); } } }
其中Activity的代码如下所示:
public class MainActivity extends AppCompatActivity { @BindView(R.id.recycler_view) RecyclerView mRecyclerView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ButterKnife.bind(this); List<String> strings = new ArrayList<>(); for (int i = 0; i < 20; i++) { strings.add("String" + i); } mRecyclerView.setLayoutManager(new LinearLayoutManager(this)); RecycleAdapter adapter = new RecycleAdapter(this, strings); mRecyclerView.setAdapter(adapter); } }
在Module中使用ButterKnife需要注意,在每个模块的build.gradle文件中都需要添加相应的注解:
annotationProcessor "com.jakewharton:butterknife-compiler:10.2.3"
而在Module中进行绑定ID操作需要使用R2即可。
@BindView(R2.id.tv_text) TextView tvText;