Android 反射获得控件对象
来源:互联网 发布:java使用线程池例子 编辑:程序博客网 时间:2024/05/18 03:04
例:
@ViewInject(R.id.pull_to_refresh_listview)private PullToRefreshListView pullToRefreshListView;不再使用一下代码初始化
pullToRefreshListView = (PullToRefreshListView) findViewById(R.id.pullToRefreshListView);
实现方式(网上有很多代码):
一个interface和一个class
interface:
import java.lang.annotation.ElementType;import java.lang.annotation.Retention;import java.lang.annotation.RetentionPolicy;import java.lang.annotation.Target;/** * Created by anykaa on 2015/6/3. */@Target(ElementType.FIELD)@Retention(RetentionPolicy.RUNTIME)public @interface ViewInject { int value();}classimport android.app.Activity;import java.lang.reflect.Field;/** * Created by anykaa on 2015/6/3. */@SuppressWarnings("unused")public class ViewInjectClass { public static void autoInjectAllField(Activity activity) { //得到Activity对应的Class Class clazz = activity.getClass(); //得到该Activity的所有字段 Field[] fields = clazz.getDeclaredFields(); try { for (Field field : fields) { //判断字段是否标注InjectView if (field.isAnnotationPresent(ViewInject.class)) { //如果标注了,就获得它的id ViewInject inject = field.getAnnotation(ViewInject.class); int id = inject.value(); if (id > 0) { //反射访问私有成员,必须加上这句 field.setAccessible(true); try { //然后对这个属性复制 field.set(activity, activity.findViewById(id)); } catch (Exception ex) { } } } } } catch (Exception ex) { ex.printStackTrace(); } }}
使用方式及建议:
统一写一个BaseActivity
import android.os.Bundle;import android.support.v7.app.AppCompatActivity;import com.anykaalibrary.ViewInjectClass;/** * Created by anykaa on 15/12/30. */public class BaseActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); } @Override public void setContentView(int layoutResID) { super.setContentView(layoutResID); ViewInjectClass.autoInjectAllField(this); }}使用
其实我并不建议这样使用,我倒是希望开发工具能够根据类似这种代码,在编译前自动将代码改成public class MainActivity extends BaseActivity { @ViewInject(R.id.pull_to_refresh_listview) private PullToRefreshListView pullToRefreshListView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); }}
pullToRefreshListView = (PullToRefreshListView) findViewById(R.id.pullToRefreshListView);
这种形式。
特此梳理备用。
0 0
- Android 反射获得控件对象
- 反射获得对象的值
- android通过反射代替R来获取控件对象
- 通过反射获得类的实例对象
- 利用反射获得对象的属性值
- java 反射获得私有属性的对象
- Java的反射获得Class对象
- android获得layout对象
- Android设置控件获得焦点
- Android 获得控件的高度
- android通过反射获得资源数据
- 反射获得WEB页面的服务器控件信息
- Android如何获得Context对象
- wpf 通过Name反射获取控件对象
- 通过反射技术获得实例对象的属性值
- java中利用反射获得对象的各种信息
- 通过反射查看类信息---获得Class对象
- Java中通过反射获得对象的属性信息
- Git协作流程详解
- [Sqlserver] SQL Server Storage Engine: Data Pages and Data Rows
- Cocos2d_android你所需要知道的一切(下)
- Android 获取手机系统的声音设置管理通知提醒的声音
- Windows中快速在指定文件打开命令行
- Android 反射获得控件对象
- 总结
- 定制自己的BaseActivity
- “Ceph浅析”系列之五Ceph的工作原理及流程
- ubuntu14.04环境变量设置
- iOS的多线程(GCD)
- android入门
- C 语言union
- Android-Displaying Bitmaps Efficiently