1.新建一个model
2.在里面创建类OnClick MyDelare BindView ButterKnife
3. 导入插件依赖
//插件依赖
implementation 'com.jakewharton:butterknife:8.8.1'
annotationProcessor 'com.jakewharton:butterknife-compiler:8.8.1'
//新建OnClick
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface OnClick {
int[] value();
}
//新建MyDelare
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface MyDelare {
}
//新建BindView
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface BindView {
int value()default -1;
}
//新建ButterKnife
public class ButterKnife { public static void bind(final Activity activity){ Class< Activity> clazz = (Class<Activity>) activity.getClass(); Field[] declaredFields = clazz.getDeclaredFields(); //遍历 for(Field field:declaredFields){ field.setAccessible(true); //判断当前的field是否被bindview修饰 if(field.isAnnotationPresent(BindView.class)){ //拿到注解对象 BindView annotation = field.getAnnotation(BindView.class); int id=annotation.value(); try { //给控件赋值 View view = activity.findViewById(id); //赋值 field.set(activity,view); //判断是否过时 if(field.isAnnotationPresent(MyDelare.class)){ if(view instanceof TextView){ TextView textView= (TextView) view; textView.getPaint().setFlags(Paint.STRIKE_THRU_TEXT_FLAG); } } }catch (IllegalAccessException e){ e.printStackTrace(); } } } Method[] declaredMethods = clazz.getDeclaredMethods(); for (final Method method:declaredMethods){ method.setAccessible(true); if (method.isAnnotationPresent(OnClick.class)){ OnClick annotation = method.getAnnotation(OnClick.class); int[] value = annotation.value(); for(int id:value){ //获取id final View view = activity.findViewById(id); view.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { try { method.invoke(activity,view); }catch (IllegalAccessException e){ e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); } } }); } } } } }//xml文件
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity"> <Button android:id="@+id/btn_left" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="LEFT" /> <TextView android:id="@+id/tv_name" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="How are you" android:layout_centerHorizontal="true" /> <Button android:id="@+id/btn_right" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentRight="true" android:text="RIGHT" /> </RelativeLayout>
//MainActivity
public class MainActivity extends AppCompatActivity { @MyDelare @BindView(R.id.btn_left) Button btnLeft; @BindView(R.id.tv_name) TextView tvName; @BindView(R.id.btn_right) Button btnRight; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ButterKnife.bind(this); } @OnClick({R.id.btn_left, R.id.tv_name, R.id.btn_right}) public void onViewClicked(View view) { switch (view.getId()) { case R.id.btn_left: Toast.makeText(MainActivity.this,"left",Toast.LENGTH_SHORT).show(); break; case R.id.tv_name: Toast.makeText(MainActivity.this,"666",Toast.LENGTH_SHORT).show(); break; case R.id.btn_right: Toast.makeText(MainActivity.this,"right",Toast.LENGTH_SHORT).show(); break; } } }