查资料了解了一下注解,因此想到封装一个BaseActivity让其他的类去继承,这样就省了很多事情。demo下载地址http://download.csdn.net/detail/u012303938/8435675
BaseActivity
package com.example.baseactivity;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import android.app.Activity;
import android.os.Bundle;
import android.view.Window;
public abstract class BaseActivity extends Activity{
private Class<?> clazz;
protected void onCreate(Bundle savedInstanceState,int layoutResID ){
// TODO 自动生成的方法存根
super.onCreate(savedInstanceState );
this.requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(layoutResID);
clazz=this.getClass();
//finviewbyid注解
byIdContentView();
byIdViews();
findViews();
addListeners();
}
private void byIdContentView() {
// TODO 自动生成的方法存根
//获取注解
FindViewById view=clazz.getAnnotation(FindViewById.class);
//获取注解的值
if(view!=null){
int id=view.id();
//获取类的ContentView方法
try {
Method method=clazz.getMethod("ContentView", int.class);
try {
method.setAccessible(true);
method.invoke(this, id);
} catch (IllegalAccessException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
} catch (IllegalArgumentException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
} catch (InvocationTargetException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
} catch (NoSuchMethodException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
}
}
private void byIdViews() {
// TODO 自动生成的方法存根
//获取类所有的属性对象
Field []fields=clazz.getDeclaredFields();
if(fields!=null){
for(Field field:fields){
//获取当前属性的注解
FindViewById viewById=field.getAnnotation(FindViewById.class);
//获取注解的值
int id=viewById.id();
//获取类的findviewbyid方法
try {
Method method=clazz.getMethod("findViewById", int.class);
try {
Object obj=method.invoke(this, id);
field.setAccessible(true);
//将设置好的方法放入属性中
field.set(this, obj);
} catch (IllegalAccessException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
} catch (IllegalArgumentException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
} catch (InvocationTargetException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
} catch (NoSuchMethodException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
}
}
}
public abstract void findViews() ;
public abstract void addListeners();
}
注解findviewbyid
package com.example.baseactivity;
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 FindViewById {
int id();
}
mainActitity
package com.example.baseactivity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
public class MainActivity extends BaseActivity {
/*
* 用注解去初始化finviewbyid
*
*/
@FindViewById(id=R.id.et_t)
private EditText et_t;
@FindViewById(id=R.id.tv_t)
private TextView tv_t;
@FindViewById(id=R.id.btn_t)
private Button btn_t;
protected void onCreate(Bundle savedInstanceState) {
// TODO 自动生成的方法存根
super.onCreate(savedInstanceState,R.layout.activity_main);
}
@Override
public void findViews() {
// TODO 自动生成的方法存根
}
@Override
public void addListeners() {
// TODO 自动生成的方法存根
btn_t.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO 自动生成的方法存根
String str=et_t.getText().toString();
tv_t.setText(str);
}
});
}
}
activity_main
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/et_t"/>
<Button android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/btn_t"
android:text="确定"
/>
<TextView
android:id="@+id/tv_t"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="ad"/>
</LinearLayout>