Android使用註解避免大量的findViewById()
阿新 • • 發佈:2019-01-06
BindView註解類 @Target(ElementType.FIELD)//表示要註解的是一個欄位 @Retention(RetentionPolicy.RUNTIME) //新增@interface表明這是一個註解,等價於繼承了java.lang.annotation.Annotation這個類 public @interface BindView { public int id();//view的id public boolean clickable() default false;//是否可點選,預設為false } 使用
public class AnnotationActivity extendsActivity implements View.OnClickListener { @BindView(id = R.id.text_anno, clickable = true) private TextView textView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_annotation); initView(this, findViewById(android.R.id.content)); } private void initView(Object viewClass, View view) { Field[] fields = viewClass.getClass().getDeclaredFields(); if (fields != null && fields.length > 0) { for (Field field : fields) { BindView bindView = field.getAnnotation(BindView.class); if (bindView != null) { int id = bindView.id(); boolean clickable = bindView.clickable(); try { field.setAccessible(true); if (clickable) { view.findViewById(id).setOnClickListener((View.OnClickListener) viewClass); } //將viewClass中的field賦值為view.findViewById(id) field.set(viewClass, view.findViewById(id)); } catch (IllegalAccessException e) { e.printStackTrace(); } } } } } @Override public void onClick(View v) { Toast.makeText(this, "click!", Toast.LENGTH_SHORT).show(); textView.setText("click"); }