編輯:關於Android編程
想必開發過android的都使用過一些 框架,然而框架裡都會使用一些,注解來幫助我們,節省大量的代碼開發量。同時也使代碼更加的簡潔。
但是注解是通過java反射來實現的當然可能會犧牲掉一些性能。
以下是本人寫的一個較為簡單的綁定控件,並且觸發其OnclickListem 事件。
//直接先看下注解方法。比較簡單,清晰
public class MainActivity extends FragmentActivity {
//綁定對應的按鈕控件,事件名稱為onClickCallback
@InjectView(id = R.id.button1, clickMethod = "onClickCallback")
private Button Button1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
UIBindUtil.bind(this);//初始化綁定
}
@ClickMethod(R.id.button1)
public void onClickCallback(View view) {//觸發的事件
Toast.makeText(MainActivity.this, "我是注解", 1).show();
}
}
//接下來是綁定的初始化類
package com.ferris.ioc;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import android.app.Activity;
public class UIBindUtil {
/**
* 綁定初始化各個空間的屬性以及事件
* @param activity
*/
public static void bind(Activity activity) {
Class> cl = activity.getClass();
bindViews(activity, cl);
bindMethods(activity, cl);
}
/**
* 為按鈕綁定對應的事件方法
* @param activity
* @param cl
*/
private static void bindMethods(Activity activity, Class> cl) {
for (Method method : cl.getDeclaredMethods()) {
ClickMethod oc = method.getAnnotation(ClickMethod.class);
if (oc != null) {
int ids[] = oc.value();
for (int id : ids) {
OnEventListener listener = new OnEventListener(activity)
.setmClick(id,method.getName());
activity.findViewById(id).setOnClickListener(listener);
}
}
}
}
/**
* 初始化按鈕
* @param activity
* @param cl
*/
private static void bindViews(Activity activity, Class> cl) {
try {
for (Field field : cl.getDeclaredFields()) {
InjectView av = field.getAnnotation(InjectView.class);
if (av != null) {
field.setAccessible(true);
setView(field, activity, av.id());
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
private static void setView(Field view, Activity activity, int id)
throws IllegalArgumentException, IllegalAccessException {
view.set(activity, activity.findViewById(id));
}
}package com.ferris.ioc;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface ClickMethod {
int[] value() default {};
}
package com.ferris.ioc;
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 InjectView {
public int id();
public String clickMethod() default ""; // 點擊回調方法(方法參數必須只有一個View!)
}
//綁定方法事件觸發管理類,管理類比較簡單,我簡單注釋了下。相信看起來容易了package com.ferris.ioc;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Map;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.text.TextUtils;
import android.view.View;
import android.view.View.OnClickListener;
@SuppressLint("UseSparseArrays")
public class OnEventListener implements OnClickListener{
private Activity activity;
private static Map listeners = new HashMap(); //我們保存著控件ID以及方法名稱的關聯
public OnEventListener(Activity activity) {
// TODO Auto-generated constructor stub
this.activity=activity;
}
public OnEventListener() {
}
public OnEventListener setmClick(Integer id,String name) { //添加關聯,並返回監聽接口給View進行設置監聽
// TODO Auto-generated method stub
listeners.put(id, name);
return this;
}
@Override
public void onClick(View v) { //當有事件觸發,則通過id去獲取對應的方法,傳遞參數給方法觸發對應的方法。即可
// TODO Auto-generated method stub
if(listeners==null||listeners.size()<=0){
return;
}
String methodName=listeners.get(v.getId());
if(TextUtils.isEmpty(methodName)){
return;
}
try {
//通過類去查找對應的方法以及參數類型
Method callbackMethod = activity.getClass().getDeclaredMethod(methodName, View.class);
callbackMethod.setAccessible(true);
//傳遞對應的參數過去
callbackMethod.invoke(activity, v);
} catch (Exception e) {
e.printStackTrace();
}
}
}
android開發往SDK上追加文件
android手機內存本來就不大,要是老把數據放在手機裡,很明顯會讓手機的使用者體驗到什麼是“卡”,所以,我們把數據要放到SD卡中,以減少手機內存的使用,本文僅寫入文件
android編程實現懸浮窗體的方法
本文實例講述了android編程實現懸浮窗體的方法。分享給大家供大家參考,具體如下:突然對懸浮窗體感興趣,查資料做了個小Demo,效果是點擊按鈕後,關閉當前Activit
最近寫的一個控件——Well Swipe 拖拽排序實現
如圖:>刪除過渡動畫>拖拽排序
Android DrawerLayout帶有側滑功能的布局類(1)
DrawerLayout顧名思義就是一個管理布局的。使用方式可以與其它的布局類類似。DrawerLayout帶有滑動的功能。只要按照drawerLayout的規定布局方式