Java tutorial
/** * Copyright (c) 2012-2013, Michael Yang ?? (www.yangfuhai.com). * <p> * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * <p> * http://www.apache.org/licenses/LICENSE-2.0 * <p> * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package net.tsz.afinal; import android.app.Activity; import android.support.v4.app.FragmentActivity; import android.text.TextUtils; import android.view.View; import android.view.ViewGroup.LayoutParams; import android.widget.AbsListView; import net.tsz.afinal.annotation.view.CodeNote; import net.tsz.afinal.annotation.view.EventListener; import net.tsz.afinal.annotation.view.Select; import java.lang.reflect.Field; public abstract class FinalFragmentActivity extends FragmentActivity { public void setContentView(int layoutResID) { super.setContentView(layoutResID); initInjectedView(this); } public void setContentView(View view, LayoutParams params) { super.setContentView(view, params); initInjectedView(this); } public void setContentView(View view) { super.setContentView(view); initInjectedView(this); } public static void initInjectedView(Activity activity) { initInjectedView(activity, activity.getWindow().getDecorView()); } public static void initInjectedView(Object injectedSource, View sourceView) { Field[] fields = injectedSource.getClass().getDeclaredFields(); if (fields != null && fields.length > 0) { for (Field field : fields) { try { field.setAccessible(true); if (field.get(injectedSource) != null) continue; CodeNote viewInject = field.getAnnotation(CodeNote.class); if (viewInject != null) { int viewId = viewInject.id(); field.set(injectedSource, sourceView.findViewById(viewId)); setListener(injectedSource, field, viewInject.click(), Method.Click); setListener(injectedSource, field, viewInject.longClick(), Method.LongClick); setListener(injectedSource, field, viewInject.itemClick(), Method.ItemClick); setListener(injectedSource, field, viewInject.itemLongClick(), Method.itemLongClick); Select select = viewInject.select(); if (!TextUtils.isEmpty(select.selected())) { setViewSelectListener(injectedSource, field, select.selected(), select.noSelected()); } } } catch (Exception e) { e.printStackTrace(); } } } } private static void setViewSelectListener(Object injectedSource, Field field, String select, String noSelect) throws Exception { Object obj = field.get(injectedSource); if (obj instanceof View) { ((AbsListView) obj) .setOnItemSelectedListener(new EventListener(injectedSource).select(select).noSelect(noSelect)); } } private static void setListener(Object injectedSource, Field field, String methodName, Method method) throws Exception { if (methodName == null || methodName.trim().length() == 0) return; Object obj = field.get(injectedSource); switch (method) { case Click: if (obj instanceof View) { ((View) obj).setOnClickListener(new EventListener(injectedSource).click(methodName)); } break; case ItemClick: if (obj instanceof AbsListView) { ((AbsListView) obj).setOnItemClickListener(new EventListener(injectedSource).itemClick(methodName)); } break; case LongClick: if (obj instanceof View) { ((View) obj).setOnLongClickListener(new EventListener(injectedSource).longClick(methodName)); } break; case itemLongClick: if (obj instanceof AbsListView) { ((AbsListView) obj) .setOnItemLongClickListener(new EventListener(injectedSource).itemLongClick(methodName)); } break; default: break; } } public enum Method { Click, LongClick, ItemClick, itemLongClick } }