android 超级简单方便的注解注入控件和方法

来源:互联网 发布:网络项目实施计划书 编辑:程序博客网 时间:2024/05/17 23:45

1 注入控件变量的注解类

@java.lang.annotation.Retention(value = java.lang.annotation.RetentionPolicy.CLASS)@java.lang.annotation.Target(value = { java.lang.annotation.ElementType.FIELD })public @interface FindView {public int value();}




2 注入方法绑定的注解类,使用数组因为可能多个id绑定同一个事件

@java.lang.annotation.Retention(value = java.lang.annotation.RetentionPolicy.CLASS)@java.lang.annotation.Target(value = { java.lang.annotation.ElementType.METHOD })public @interface OnClick {public abstract int[] value();}




3 实现类

public class Injector {public boolean set_bind_field = true;public boolean set_bind_method = true;/** * inject for field and method that be annotated *  * @param obj *            Bind Object * @param view *            Content View */public void inject(final Object obj, View view) {if (set_bind_field) {Field[] privatefields = obj.getClass().getDeclaredFields();for (Field f : privatefields)bindField(obj, f, view);}if (set_bind_method) {Method[] privatemethods = obj.getClass().getDeclaredMethods();for (final Method m : privatemethods)bindMethod(obj, m, view);}}public void inject(final Activity activity) {inject(activity, activity.getWindow().getDecorView());}// ///////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////* * bind field */private static void bindField(Object obj, Field f, View view) {f.setAccessible(true);FindView anno = f.getAnnotation(FindView.class);if (anno != null)try {f.set(obj, view.findViewById(anno.value()));} catch (Exception e) {}}/* * bind method to view by id */private static void bindMethod(final Object obj, final Method m, View view) {m.setAccessible(true);OnClick oc = m.getAnnotation(OnClick.class);if (oc != null)try {OnClickListener clickListener = new View.OnClickListener() {public void onClick(View v) {try {m.invoke(obj, new Object[] {});} catch (Exception e) {}}};for (int id : oc.value())try {view.findViewById(id).setOnClickListener(clickListener);} catch (Exception e) {}} catch (Exception e) {}}}

4 使用 MainActivity.java

public class MainActivity extends Activity {@FindView(R.id.btn)public Button button;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);new Injector().inject(this);button.setText("hello");}@OnClick({ R.id.btn })private void tt() {Toast.makeText(this, "hello", Toast.LENGTH_SHORT).show();}}

XML

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:tools="http://schemas.android.com/tools"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:orientation="vertical"    tools:context=".MainActivity" >    <Button        android:id="@+id/btn"        android:layout_width="match_parent"        android:layout_height="100dp" /></LinearLayout>








1 0
原创粉丝点击