轻量级安卓框架源码

上代码   

自己的Activity
package com.young.android;

import com.young.android.annotation.ViewInject;

import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;

public class MainActivity extends YoungActivity {

	@ViewInject(id = R.id.tv)
	private TextView textView;

	@ViewInject(id = R.id.but)
	private Button button;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);

		textView.setText("yong   inject");

		button.setText("注解but");
		button.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View arg0) {
				// TODO Auto-generated method stub
				Toast.makeText(getApplicationContext(), "注入", 1).show();
			}
		});
	}

}


<pre name="code" class="html">布局 代码 

<LinearLayout
     xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <TextView
        android:layout_width="fill_parent"
        android:textSize="20sp"
        android:layout_height="wrap_content"
        android:id="@+id/tv"/>

    <Button
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:id="@+id/but"/>

</LinearLayout>

父Activity
package com.young.android;

import java.lang.reflect.Field;

import com.young.android.annotation.ViewInject;
import com.young.android.exception.IllegalParameterException;

import android.app.Activity;
import android.view.View;

public class YoungActivity extends Activity {

	@Override
	public void setContentView(int layoutResID) {
		// TODO Auto-generated method stub
		super.setContentView(layoutResID);
		Class<? extends YoungActivity> clz = getClass();

		Field[] fs = clz.getDeclaredFields();

		for (Field f : fs) {
			ViewInject viewInject = f.getAnnotation(ViewInject.class);
			if (viewInject != null) {
				int id = viewInject.id();
				View v = findViewById(id);
				if (v == null)
					throw new IllegalParameterException(
							"@ViewInject 参数不合法,你应该这样使用    例:首先在对应的布局文件中定义TextView,id为tv,然后在声明的TextView前标注  @ViewInject(id=R.id.tv)");

				f.setAccessible(true);
				try {
					f.set(YoungActivity.this, v);
				} catch (IllegalAccessException e) {
					// TODO Auto-generated catch block
//					e.printStackTrace();
					throw new IllegalParameterException(
							"@ViewInject 参数不合法,你应该这样使用    例:首先在对应的布局文件中定义TextView,id为tv,然后在声明的TextView前标注  @ViewInject(id=R.id.tv)");
				} catch (IllegalArgumentException e) {
					// TODO Auto-generated catch block
//					e.printStackTrace();
					throw new IllegalParameterException(
							"@ViewInject 参数不合法,你应该这样使用    例:首先在对应的布局文件中定义TextView,id为tv,然后在声明的TextView前标注  @ViewInject(id=R.id.tv)");
				}
				f.setAccessible(false);
			}
		}
	}

}
注解定义
package com.young.android.annotation;
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 ViewInject {

	public int id() default 0;

}
异常

package com.young.android.exception;

public class IllegalParameterException extends RuntimeException{

	private static final long serialVersionUID = 839888641617782091L;

	public IllegalParameterException(String detailMessage) {
		super(detailMessage);
		// TODO Auto-generated constructor stub
	}

}
时间: 2024-09-28 11:42:49

轻量级安卓框架源码的相关文章

安卓图表引擎AChartEngine(六) - 框架源码结构图

包结构: org.achartengine: org.achartengine.model: org.achartengine.renderer: org.achartengine.tools: 安卓图表引擎AChartEngine(一) - 简介 http://blog.csdn.net/lk_blog/article/details/7645509 安卓图表引擎AChartEngine(二) - 示例源码概述和分析 http://blog.csdn.net/lk_blog/article/d

android源码大放送(实战开发必备),免费安卓demo源码,例子大全文件详细列表

免费安卓demo源码,例子大全文件详细列表 本列表源码永久免费下载地址:http://www.jiandaima.com/blog/android-demo 卷 yunpan 的文件夹 PATH 列表 卷序列号为 0000-73EC E:. │ jiandaima.com文件列表生成.bat │ 例子大全说明.txt │ 本例子永久更新地址~.url │ 目录列表2016.03.10更新.txt │ ├─前台界面 │ ├─3D标签云卡片热门 │ │ Android TagCloudView云标签

iOS开发之Masonry框架源码深度解析

Masonry是iOS在控件布局中经常使用的一个轻量级框架,Masonry让NSLayoutConstraint使用起来更为简洁.Masonry简化了NSLayoutConstraint的使用方式,让我们可以以链式的方式为我们的控件指定约束.本篇博客的主题不是教你如何去使用Masonry框架的,而是对Masonry框架的源码进行解析,让你明白Masonry是如何对NSLayoutConstraint进行封装的,以及Masonry框架中的各个部分所扮演的角色是什么样的.在Masonry框架中,仔细

iOS开发之Masonry框架源码解析

Masonry是iOS在控件布局中经常使用的一个轻量级框架,Masonry让NSLayoutConstraint使用起来更为简洁.Masonry简化了NSLayoutConstraint的使用方式,让我们可以以链式的方式为我们的控件指定约束.本篇博客的主题不是教你如何去使用Masonry框架的,而是对Masonry框架的源码进行解析,让你明白Masonry是如何对NSLayoutConstraint进行封装的,以及Masonry框架中的各个部分所扮演的角色是什么样的.在Masonry框架中,仔细

2020年去一线大厂面试先过SSM框架源码这一关!

SSM框架介绍 (1)持久层(Mybatis):Dao层(mapper) DAO层:DAO层主要是做数据持久层的工作,负责与数据库进行联络的一些任务都封装在此. DAO层的设计首先是设计DAO的接口. 然后在Spring的配置文件中定义此接口的实现类. 然后就可在模块中调用此接口来进行数据业务的处理,而不用关心此接口的具体实现类是哪个类,显得结构非常清晰. DAO层的数据源配置,以及有关数据库连接的参数都在Spring的配置文件中进行配置. (2)业务层(Spring):Service层 Ser

CI框架源码阅读笔记3 全局函数Common.php

从本篇开始,将深入CI框架的内部,一步步去探索这个框架的实现.结构和设计. Common.php文件定义了一系列的全局函数(一般来说,全局函数具有最高的加载优先权,因此大多数的框架中BootStrap引导文件都会最先引入全局函数,以便于之后的处理工作). 打开Common.php中,第一行代码就非常诡异: if ( ! defined('BASEPATH')) exit('No direct script access allowed'); 上一篇(CI框架源码阅读笔记2 一切的入口 index

Volley框架源码浅析(一)

尊重原创http://blog.csdn.net/yuanzeyao/article/details/25837897 从今天开始,我打算为大家呈现关于Volley框架的源码分析的文章,Volley框架是Google在2013年发布的,主要用于实现频繁而且粒度比较细小的Http请求,在此之前Android中进行Http请求通常是使用HttpUrlConnection和HttpClient进行,但是使用起来非常麻烦,而且效率比较地下,我想谷歌正式基于此种原因发布了Volley框架,其实出了Voll

android-改进&lt;&lt;仿QQ&gt;&gt;框架源码

该文章主要修改于CSDN某大神的一篇文章,本人觉得这篇文章的面向对象很透彻,下面分享如下可学习的几点: Android应用经典主界面框架之一:仿QQ (使用Fragment, 附源码) 1.通过&符号实现计算优化:(后来通过问同事,说是计算机通过位运算 效率比平时的switch效率高,并讲解了该算法的原理.) public class Constant { public static final int SIGN_FRAGMENT_MESSAGE=0x01 <<1; public st

Volley框架源码浅析(二)

尊重原创 http://write.blog.csdn.net/postedit/25921795 在前面的一片文章Volley框架浅析(一)中我们知道在RequestQueue这个类中,有两个队列:本地队列和网络队列 /** The cache triage queue. */ private final PriorityBlockingQueue<Request<?>> mCacheQueue = new PriorityBlockingQueue<Request<