android视图注解加载的实现
来源:互联网 发布:跟孩子一起学编程 pdf 编辑:程序博客网 时间:2024/06/13 09:37
注解:
其实注解这东西说神秘也不神秘,因为在各种项目中我们一直有用。比如Spring3中能见到,在android的一些快速开发框架中也能看到。但是说它不神秘,其实也是蛮神秘的,虽然我一直都有接触这个功能,但却从来没仔细的去关注过它是怎么实现的。这次我就打算以android视图的注解缺了解它的原理,让他不再那么神秘了。
百度知道解开了我对注解的迷糊,下面是百度知道上的截图:
注解对象可以分为对 包,类,字段,构造方法,方法,参数等进行注解。
有了以上的理解后,我们就不多说了,直接上代码
<pre name="code" class="java" style="font-weight: bold;">public<pre name="code" class="java" style="font-weight: bold;">public abstract <span style="font-family: Arial, Helvetica, sans-serif;">class BaseBindActivity extends Activity {</span>@Overrideprotected final void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);bindLayout();try {bindView();} catch (Exception e) {e.printStackTrace();throw new RuntimeException("绑定出错");}onCreated(savedInstanceState);}public void onCreated(Bundle savedInstanceState) {}@Retention(RetentionPolicy.RUNTIME)// 运行时获得@Target(ElementType.FIELD)// 针对字段的注解protected @interface BindView {int viewId();}@Retention(RetentionPolicy.RUNTIME)// 运行时获得@Target(ElementType.TYPE)// 针对类的注解protected @interface BindLayout{int layoutId();}private void bindView() throws IllegalArgumentException, IllegalAccessException {
<span style="white-space:pre"></span>//获取所有成员变量Field[] fs = getClass().getDeclaredFields();if (fs != null) {for (Field f : fs) {BindView ma = f.getAnnotation(BindView.class);System.err.println(f.getName());if (ma != null) {<span style="font-family: Arial, Helvetica, sans-serif;">//如果能找到注解就开始绑定</span>
View v = findViewById(ma.viewId());if (v != null) {f.setAccessible(true);f.set(this, f.getType().cast(v));} else {throw new RuntimeException("没有找到指定id的View绑定到:"+ f.getName());}}}}}private void bindLayout(){BindLayout bl = getClass().getAnnotation(BindLayout.class);if(bl==null){throw new RuntimeException("没有绑定layout文件");}int id = bl.layoutId();if(id==0)throw new RuntimeException("绑定的layout文件无效");setContentView(id);}}1.继承Activity,方便使用它的一些方法,比如setContentView,findViewById等
2.声明注解接口:BindView,BindLayout
3.重新oncreate方法,对该方法加final关键字,保证不被子类改写
4.实现bindLayout方法,完成绑定layout文件
5.实现bindView方法,完成对View及其子类的成员变量的绑定
6.声明一个oncreated方法,让子类去复写,完成本应在Oncreate方法中完成的逻辑
现在父类准备了号看看在子类怎么去用
@BindLayout(layoutId = R.layout.activity_main)public class MainActivity extends BaseBindActivity {@BindView(viewId = R.id.tv)private TextView tv;@Overridepublic void onCreated(Bundle savedInstanceState) {ComponentName cn = new ComponentName(this, "testauto.B");PackageManager pm = getPackageManager();int state = pm.getComponentEnabledSetting(cn);tv.setText(state+" "+android.os.Build.MODEL);}@Overridepublic boolean onCreateOptionsMenu(Menu menu) {return true;}}1.继承BaseBindActivity
2.在类声明的地方加上 @BindLayout(layoutId = R.layout.activity_main) , R.layout.activity_main 是你要绑定的layout文件
3.在声明成员视图变量时 加上@BindView(viewId = R.id.tv) R.id.tv是你想要绑定View的Id
1 1
- android视图注解加载的实现
- Android通过链接视图和加载视图实现GOT HOOK
- Android视图加载到窗口的分析
- 用注解的方式来实现SPIRNG视图转换
- 利用自定义注解实现安卓中视图的绑定
- Android实现注解的方式
- 视图加载的生命周期
- RecyclerView和ListView实现多视图加载的方法
- RecycleView加载更多视图(状态)的详细实现
- Android视图的顶部悬停的实现
- Android基于元注解实现一个简单的字段注解
- android 按需加载视图
- Android之加载视图Loading
- Android ListView加载头视图后容易忽略的问题
- Android视图加载到窗口的过程分析
- android listview 加载多种不同视图的条目
- Android视图加载到窗体的流程分析
- Android视图SurfaceView的实现原理分析
- 领域驱动设计(DDD)
- iOS 获取手机音量
- 第6周项目5-友元类-时间类
- spark1.2.1下的sql测试
- 常用正则表达式大全
- android视图注解加载的实现
- OpenGL的矩阵运算是与DirectX相反的
- 【Java.Core】Java中可变长参数的使用及注意事项
- 第六周课后实践:阅读程序
- 产品升级的核心在“架构能力”升级
- 实现滚动条的属性名称
- bigram分词
- Fragment记录
- 导航栏颜色