android註解實現findViewById
阿新 • • 發佈:2018-11-08
import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.view.View; import android.widget.Button; import android.widget.Toast; import com.android.annotationproject.util.BindView; import com.android.annotationproject.util.OnClick; import com.android.annotationproject.util.WyqBind; public class MainActivity extends AppCompatActivity { @BindView(R.id.btn_action) private Button btnAction; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); WyqBind.bind(this); btnAction.setText("註解的實現依賴於java的反射機制"); } @OnClick(R.id.btn_action) public void onClick(View view) { switch (view.getId()) { case R.id.btn_action: Toast.makeText(this, "按鈕被點選了", Toast.LENGTH_SHORT).show(); break; } } }
import android.app.Activity; import android.support.annotation.NonNull; import android.support.annotation.UiThread; import android.view.View; import java.lang.reflect.Field; import java.lang.reflect.Method; public class WyqBind { @NonNull @UiThread public static void bind(@NonNull Activity target) { findViewById(target); onClick(target); } private static void findViewById(Activity activity) { Class<? extends Activity> clazz = activity.getClass(); Field[] declaredFields = clazz.getDeclaredFields(); for (int i = 0; i < declaredFields.length; i++) { Field field = declaredFields[i]; BindView annotation = field.getAnnotation(BindView.class); if (annotation != null) { int viewId = annotation.value(); View view = activity.findViewById(viewId); try { field.setAccessible(true); field.set(activity, view); } catch (Exception e) { e.printStackTrace(); } } } } private static void onClick(final Activity activity) { Class<?> clazz = activity.getClass(); try { final Method method = clazz.getMethod("onClick", View.class); OnClick onClick = method.getAnnotation(OnClick.class); if (onClick != null) { int[] viewIds = onClick.value(); for (int viewId : viewIds) { final View view = activity.findViewById(viewId); view.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { method.setAccessible(true); try { method.invoke(activity); } catch (Exception e) { e.printStackTrace(); try { method.invoke(activity, view); } catch (Exception e1) { e1.printStackTrace(); } } } }); } } } catch (Exception e) { e.printStackTrace(); } } }
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface OnClick {
int[] value();
}
import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; @Target(ElementType.FIELD) @Retention(RetentionPolicy.RUNTIME) public @interface BindView { int value(); }