android视图注解加载的实现


注解:

其实注解这东西说神秘也不神秘,因为在各种项目中我们一直有用。比如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;
	@Override
	public 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);
	}

	@Override
	public 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

时间: 2024-10-29 21:18:34

android视图注解加载的实现的相关文章

android Listview分批加载+自动加载(附源码下载)

直接上代码,代码有注释: public class TestForListviewActivity extends Activity implements OnScrollListener { private ListView mListview = null; private View mFooterView; private PaginationAdapter mAdapter; private Handler handler=new Handler(); private boolean i

Android数据分批加载-滑动到底部自动加载列表

Android数据分批加载-滑动到底部自动加载列表 2014年5月9日 本博文介绍如何进行数据分批加载,在应用开发当中会经常使用到ListView,点击更多加载数据是我们经常简单,为了提供用户体验,当用户将列表滚动到底部自动加载数据,这样的形式用得比较多. 下面给大家提供的例子是,每次模拟20条数据,滑动到底部时再请求20条数据直到请求到限定页数为止 具体代码实现: /08_Datapageload/src/com/wwj/datapageload/MainActivity.java packa

Android之SystemUI加载流程和NavigationBar的分析

Android之SystemUI加载流程和NavigationBar的分析 本篇只分析SystemUI的加载过程和SystemUI的其中的一个模块StatusBar的小模块NavigationBar,以Android6.0代码进行分析 AndroidManifest.xml <application android:name=".SystemUIApplication" android:persistent="true" android:allowClearU

Android 下分批加载数据以及listView使用过程中的优化

需求:在开发过程中,listview加载的数据如果比较大,这时为了提高用户体验感,我们应该事先分批加载以及下拉刷新功能 1.首先,数据访问层需要提供分批加载功能的接口, 代码如下: package com.zaizai.safty.db.dao; import android.content.ContentValues; import android.content.Context; import android.database.Cursor; import android.database.

Android AsyncTask异步加载WebAPI

之前做的程序一直存在很多问题,因为需要加载的Activity需要从网络加载数据.并没有完全正确的使用异步的方法去加载! 之前用的虽然是AsyncTask,但是在加载完成的时候还是并没有使用AsyncTask内置的方法去处理.而已傻傻的在OnCreate中处理.结果还是要等待AsyncTask加载完成后,等待OnCreate执行完成后,才load到Activity.这样子给人的第一感觉就是卡机了一样! 果断重新再写,这次的代码真是大换血.首先还是选择把带分页ListView进行封装了一下. 1 i

Android处理延时加载的方法

在项目开发中,经常需要通过延时加载来实现满足我们的项目要求.那到底怎样来实现延时,下面结合java与android的相关方法来实现延时问题. 一.利用线程的Sleep方法 <span style="font-family:Microsoft YaHei;font-size:18px;"><span style="white-space:pre"> </span>new Thread(new Runnable(){ @Overrid

【转】Android类动态加载技术

http://www.blogjava.net/zh-weir/archive/2011/10/29/362294.html Android应用开发在一般情况下,常规的开发方式和代码架构就能满足我们的普通需求.但是有些特殊问题,常常引发我们进一步的沉思.我们从沉思中产生顿悟,从而产生新的技术形式. 如何开发一个可以自定义控件的Android应用?就像eclipse一样,可以动态加载插件:如何让Android应用执行服务器上的不可预知的代码?如何对Android应用加密,而只在执行时自解密,从而防

图片--Android有效解决加载大图片时内存溢出的问题

Android有效解决加载大图片时内存溢出的问题 博客分类: Android Android游戏虚拟机算法JNI 尽量不要使用setImageBitmap或setImageResource或BitmapFactory.decodeResource来设置一张大图,因为这些函数在完成decode后,最终都是通过java层的createBitmap来完成的,需要消耗更多内存. 因此,改用先通过BitmapFactory.decodeStream方法,创建出一个bitmap,再将其设为ImageView

Android图片异步加载之Android-Universal-Image-Loader

将近一个月没有更新博客了,由于这段时间以来准备毕业论文等各种事务缠身,一直没有时间和精力沉下来继续学习和整理一些东西.最近刚刚恢复到正轨,正好这两天看了下Android上关于图片异步加载的开源项目,就顺便整理记录下来,作为这一个多月来博客的重新开火做饭吧.从今天起我会陆续恢复博客的更新,也希望大家继续支持. 今天要介绍的是Github上一个使用非常广泛的图片异步加载库Android-Universal-Image-Loader,该项目的功能十分强大,可以说是我见过的目前功能最全.性能最优的图片异