作为一个移动应用开发者,随着需求的日益增多,Android项目的越来越臃肿,代码量越来越大,

现在冷静下来回头看看我们的代码,有多少代码跟业务逻辑没什么关系的

所以,本人自不量力,在github上建了个开源项目,希望能一定程度地简化我的代码-。-

现在第一个版本完成,希望有兴趣的朋友能加入一起完善。

本人才疏学浅,代码中有写得不妥的地方希望大家不吝赐教哈!

github地址:

https://github.com/wangjiegulu/androidInject

androidInject_1.0.jar:

http://pan.baidu.com/s/1rcSiy

主要的思想就是通过注解的方式,把我们要做的事情直接注入进来给我们,“不是我去调用对象,而是对象自己来找我”

现在刚写完了10个注解:

@AINoTitle, @AIFullScreen, @AILayout, @AIView, @AIBean, @AISystemService, @AIClick, @AIItemClick, @AILongClick, @AIItemLongClick

使用方法如下:

Activity中使用:

package com.wangjie.androidinject;

import android.app.AlarmManager;
import android.content.Intent;
import android.location.LocationManager;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.*;
import com.wangjie.androidinject.annotation.annotations.*;
import com.wangjie.androidinject.annotation.present.AIActivity;
import com.wangjie.androidinject.model.Person; import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map; @AIFullScreen
@AINoTitle
@AILayout(R.layout.main)
public class MainActivity extends AIActivity{ @AIView(id = R.id.btn1, clickMethod = "onClickCallback", longClickMethod = "onLongClickCallback")
private Button btn1; @AIView(clickMethod = "onClickCallback", longClickMethod = "onLongClickCallback")
private Button btn2; // @AIView(id = R.id.btn3)
// private Button btn3; // @AIView(id = R.id.listView, itemClickMethod = "onItemClickCallback", itemLongClickMethod = "onItemLongClickCallbackForListView")
@AIView(id = R.id.listView)
private ListView listView; @AIBean
private Person person; @AISystemService
private AlarmManager alarmManager;
@AISystemService
private LocationManager locationManager;
@AISystemService
private LayoutInflater inflater; @Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); List<Map<String, String>> list = new ArrayList<Map<String, String>>();
Map<String, String> map;
for(int i = 0; i < 10; i++){
map = new HashMap<String, String>();
map.put("title", "item_" + i);
list.add(map);
} SimpleAdapter adapter = new SimpleAdapter(context, list, R.layout.list_item, new String[]{"title"}, new int[]{R.id.list_item_title_tv});
listView.setAdapter(adapter); person.setName("wangjie");
person.setAge(23);
System.out.println(person.toString()); System.out.println("alarmManager: " + alarmManager + ", locationManager: " + locationManager + ", inflater: " + inflater); } @Override
public void onClickCallback(View view){
if(view instanceof Button){
Toast.makeText(context, "onClickCallback: " + ((Button)view).getText(), Toast.LENGTH_SHORT).show();
}
} @Override
public void onLongClickCallback(View view){
if(view instanceof Button){
Toast.makeText(context, "onLongClickCallback: " + ((Button)view).getText(), Toast.LENGTH_SHORT).show();
}
} @Override
public void onItemClickCallback(AdapterView<?> adapterView, View view, int i, long l) {
Toast.makeText(context, "onItemClickCallback: " + ((Map<String, String>)adapterView.getAdapter().getItem(i)).get("title"), Toast.LENGTH_SHORT).show();
} @AIClick({R.id.btn3, R.id.toFragmentBtn})
public void onClickCallbackForBtn3(View view){
if(view instanceof Button){
Toast.makeText(context, "onClickForBtn3: " + ((Button)view).getText(), Toast.LENGTH_SHORT).show();
} if(view.getId() == R.id.toFragmentBtn){
startActivity(new Intent(context, SecendActivity.class));
} } @AILongClick({R.id.btn3})
public void onLongClickCallbackForBtn3(View view){
if(view instanceof Button){
Toast.makeText(context, "onLongClickCallbackForBtn3: " + ((Button)view).getText(), Toast.LENGTH_SHORT).show();
}
} @AIItemClick({R.id.listView})
public void onItemClickCallbackForListView(AdapterView<?> adapterView, View view, int i, long l){
Toast.makeText(context, "onItemClickCallbackForListView: " + ((Map<String, String>)adapterView.getAdapter().getItem(i)).get("title"), Toast.LENGTH_SHORT).show();
} @AIItemLongClick(R.id.listView)
public boolean onItemLongClickCallbackForListView(AdapterView<?> adapterView, View view, int i, long l) {
Toast.makeText(context, "onItemLongClickCallbackForListView: " + ((Map<String, String>)adapterView.getAdapter().getItem(i)).get("title"), Toast.LENGTH_SHORT).show();
return true;
} }

Fragment中使用:

 package com.wangjie.androidinject;

 import android.app.AlarmManager;
import android.os.Bundle;
import android.view.View;
import android.widget.*;
import com.wangjie.androidinject.annotation.annotations.*;
import com.wangjie.androidinject.annotation.present.AISupportFragment;
import com.wangjie.androidinject.model.Person; import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map; /**
* Created with IntelliJ IDEA.
* Author: wangjie email:wangjie@cyyun.com
* Date: 13-12-4
* Time: 下午4:37
*/
@AILayout(R.layout.fragment_a)
public class FragmentA extends AISupportFragment{ @AIView
private Button fragmentABtn1; @AIView
private GridView fragmentGv; @AIBean
private Person person; @AISystemService
private AlarmManager alarmManager; @Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState); List<Map<String, String>> list = new ArrayList<Map<String, String>>();
Map<String, String> map;
for(int i = 0; i < 10; i++){
map = new HashMap<String, String>();
map.put("title", "fragment_item_" + i);
list.add(map);
} SimpleAdapter adapter = new SimpleAdapter(context, list, R.layout.list_item, new String[]{"title"}, new int[]{R.id.list_item_title_tv});
fragmentGv.setAdapter(adapter); person.setName("androidInject");
person.setAge(1);
System.out.println(person.toString()); System.out.println("alarmManager: " + alarmManager); } @AIClick(R.id.fragmentABtn1)
private void btnOnclick(View view){
if(view instanceof Button){
Toast.makeText(context, "btnOnclick: " + ((Button)view).getText(), Toast.LENGTH_SHORT).show();
}
} @AILongClick(R.id.fragmentABtn1)
private void btnOnLongClick(View view){
if(view instanceof Button){
Toast.makeText(context, "btnOnLongClick: " + ((Button)view).getText(), Toast.LENGTH_SHORT).show();
}
} @AIItemClick(R.id.fragmentGv)
private void gvOnItemClick(AdapterView<?> adapterView, View view, int i, long l){
Toast.makeText(context, "gvOnItemClick: " + ((Map<String, String>)adapterView.getAdapter().getItem(i)).get("title"), Toast.LENGTH_SHORT).show();
} @AIItemLongClick(R.id.fragmentGv)
private void gvOnItemLongClick(AdapterView<?> adapterView, View view, int i, long l){
Toast.makeText(context, "gvOnItemLongClick: " + ((Map<String, String>)adapterView.getAdapter().getItem(i)).get("title"), Toast.LENGTH_SHORT).show();
} }

具体注解如下:

@AINoTitle: 类注解, 只适用于Activity(需继承于AIActivity), 设置Activity不显示Title

@AIFullScreen: 类注解, 只适用于Activity(需继承于AIActivity), 设置Activity全屏

@AILayout: 类注解
value[int]: 用于设置该Activity的布局 ---- setContentView(resId);

@AIView: 属性注解
id[int]: 用于绑定控件 ---- findViewById(resId);(default identifier[R.id.{field name}] if did not set id)
clickMethod[String]: 用于设置控件点击事件的回调方法, 可选, 方法名称任意, 参数必须为(View view)
longClickMethod[String]: 用于设置控件长按的回调方法, 可选, 方法名任意, 参数必须为(View view)
itemClickMethod[String]: 用于设置控件item点击的回调方法, 可选, 方法名任意, 参数必须为(AdapterView, View, int, long)
itemLongClickMethod[String]: 用于设置控件item长按的回调方法, 可选, 方法名任意, 参数必须为(AdapterView, View, int, long)

@AIBean: 属性注解, 为该属性生成一个对象并注入, 该对象必须有个默认的不带参数的构造方法

@AISystemService: 属性注解,为该属性注入系统服务对象

@AIClick: 方法注解
value[int[], 所要绑定控件的id]: 用于绑定控件点击事件的回调方法, 方法名称任意, 参数必须为(View view)

@AIItemClick: 方法注解
value[int[], 所要绑定控件的id]: 用于绑定控件item点击事件的回调方法, 方法名称任意, 参数必须为(AdapterView, View, int, long)

@AILongClick: 方法注解
value[int[], 所要绑定控件的id]: 用于绑定控件长按事件的回调方法, 方法名称任意, 参数必须为(View view)

@AIItemLongClick: 方法注解
value[int[], 所要绑定控件的id]: 用于绑定控件item长按事件的回调方法, 方法名称任意, 参数必须为(AdapterView, View, int, long)

[android]AndroidInject框架——我的第一个android小型框架的更多相关文章

  1. Android学习笔记一之第一个Android程序

    /** *Title:总结昨天下午至今天上午的学习成果 *Author:zsg *Date:2017-8-13 / 一.了解Android 1.Android架构 Android大致可分为四层架构:L ...

  2. Android基础之用Eclipse搭建Android开发环境和创建第一个Android项目(Windows平台)

    一.搭建Android开发环境 准备工作:下载Eclipse.JDK.Android SDK.ADT插件 下载地址:Eclipse:http://www.eclipse.org/downloads/ ...

  3. android JNI (二) 第一个 android工程

    下载NDK 后 它自带有 sample,初学者 可以导入Eclipse 运行 这里 我是自己创建的一个新工程 第一步: 新建一个Android工程 jni_test(名字自取) 第二步:为工程添加 本 ...

  4. 【Android Developers Training】 1. 创建一个Android项目工程

    注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...

  5. Android入门-新手如何成功创建一个Android小应用

    原文:http://android.eoe.cn/topic/summary 第一课程:Building Your First App [本课内容简介]欢迎加入到安卓应用的开发大潮中!这门课程会教授你 ...

  6. [Android]新版的sdk中新建一个android应用,增加的PlaceholderFragment这个静态类发生的事情

    1,首先发生的是有两个布局xml,一个activity_main.xml,一个是fragment_main.xml一开始没在意,后来仔细看了原来是新功能的fragment概念等于多个场景在这个acti ...

  7. 一步步搭建自己的轻量级MVCphp框架-(四)一个国产轻量级框架Amysql源码分析(3) 总进程对象

    AmysqlProcess类,框架的总进程对象 ./Amysql/Amysql.php 下面还是和以前一样,先上代码~ class AmysqlProcess { public $AmysqlCont ...

  8. 一步步搭建自己的轻量级MVCphp框架-(三)一个国产轻量级框架Amysql源码分析(2) 进程

    Amysql类 按照我的理解这就是框架的初始化 上代码 class Amysql { public $AmysqlProcess; public function Amysql() { global ...

  9. 一步步搭建自己的轻量级MVCphp框架-(二)一个国产轻量级框架Amysql源码分析(1)

    这个框架是我一个做PHP的朋友“祥子”介绍给我的,Git地址https://coding.net/u/srar/p/AMP/git 下面从入口文件 总线程 ( index.php )开始进行分析 &l ...

随机推荐

  1. 二叉搜索树的第k个结点

    给定一颗二叉搜索树,请找出其中的第k小的结点.例如, 5 / \ 3 7 /\ /\ 2 4 6 8 中,按结点数值大小顺序第三个结点的值为4. /* public class TreeNode { ...

  2. SQL Server中的事务日志管理(7/9):处理日志过度增长

    当一切正常时,没有必要特别留意什么是事务日志,它是如何工作的.你只要确保每个数据库都有正确的备份.当出现问题时,事务日志的理解对于采取修正操作是重要的,尤其在需要紧急恢复数据库到指定点时.这系列文章会 ...

  3. JVM Tomcat性能实战

    本节只是介绍实战部分,具体的理论参数,请自行百度. 所需工具:linux服务器  Jmeter测试工具  xshell   一个web应用 Tomcat的JVM参数可以配置在catalina.sh,如 ...

  4. lucene 的评分机制

    lucene 的评分机制 elasticsearch是基于lucene的,所以他的评分机制也是基于lucene的.评分就是我们搜索的短语和索引中每篇文档的相关度打分. 如果没有干预评分算法的时候,每次 ...

  5. C#密封类

    密封类 密封类使用sealed修饰符声明. 密封类中不可能有抽象方法[因为:抽象方法必须在抽象类中,而抽象类不能是密封的或者是静态的,也就是说abstract 和sealed不能同时修饰一个类]   ...

  6. MVC中使用EF+MySQL

    最近一段时间,想在EF中使用MySQL,于是就进行了测试. 我的环境是VS2013+EF6+MySQL5.7.4 首先要下载MySQL For VisualStudio 1.1.4.Connector ...

  7. 【转】MongoDB C# / .NET Driver 中IMongoQuery的内部实现Query的用法

    MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的.他支持的数据结构非常松散,是类似 json的bjson格式,因此可以存储比较复杂的数据类型. ...

  8. 【SQL】小心字符串拼接导致长度爆表

    请看代码: DECLARE @max VARCHAR(max) SET @max='aaa...' --这里有8000个a +'bb' --连接一个varchar常量或变量 SELECT LEN(@m ...

  9. jquery内容选择器(匹配内容不为空的元素)

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  10. 更改(修改)mysql自动增序列改变从1000开始

    更改(修改)mysql自动增序列改变从1000开始 ************************************************************************** ...