├── .gitignore ├── .idea ├── .name ├── compiler.xml ├── copyright │ └── profiles_settings.xml ├── encodings.xml ├── gradle.xml ├── misc.xml ├── modules.xml ├── runConfigurations.xml └── vcs.xml ├── Courier.iml ├── README.md ├── USAGE.md ├── api ├── .gitignore ├── api.iml ├── build.gradle └── src │ └── main │ └── java │ └── com │ └── lzh │ └── courier │ └── annoapi │ ├── Field.java │ ├── FieldType.java │ └── Params.java ├── app ├── .gitignore ├── app.iml ├── build.gradle ├── proguard-rules.pro └── src │ ├── androidTest │ └── java │ │ └── org │ │ └── lzh │ │ └── framework │ │ └── courier │ │ └── ApplicationTest.java │ └── main │ ├── AndroidManifest.xml │ ├── java │ └── org │ │ └── lzh │ │ └── framework │ │ └── courier │ │ ├── EmptyActivity.java │ │ ├── MainActivity.java │ │ ├── MultiTypeActivity.java │ │ ├── ParamsActivity.java │ │ ├── ParentActivity.java │ │ ├── SubActivity.java │ │ ├── SubFragment.java │ │ ├── TestFragment.java │ │ └── model │ │ └── User.java │ └── res │ ├── layout │ ├── activity_main.xml │ ├── activity_multi_type.xml │ ├── activity_params.xml │ ├── activity_parent.xml │ ├── activity_second.xml │ └── activity_sub.xml │ ├── mipmap-hdpi │ └── ic_launcher.png │ ├── mipmap-mdpi │ └── ic_launcher.png │ ├── mipmap-xhdpi │ └── ic_launcher.png │ ├── mipmap-xxhdpi │ └── ic_launcher.png │ ├── mipmap-xxxhdpi │ └── ic_launcher.png │ ├── values-w820dp │ └── dimens.xml │ └── values │ ├── colors.xml │ ├── dimens.xml │ └── strings.xml ├── build.gradle ├── capture ├── doc_password.png ├── doc_username.png └── make_project.png ├── gradle.properties ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat ├── processor ├── .gitignore ├── build.gradle ├── processor.iml └── src │ └── main │ ├── java │ └── com │ │ └── lzh │ │ └── courier │ │ ├── FieldData.java │ │ ├── compiler │ │ ├── ActivityFactory.java │ │ ├── Compiler.java │ │ ├── ElementParser.java │ │ ├── FileFactory.java │ │ └── FragmentFactory.java │ │ ├── reflect │ │ ├── Reflect.java │ │ └── ReflectException.java │ │ └── util │ │ ├── StringUtils.java │ │ └── UtilMgr.java │ └── resources │ └── META-INF │ └── services │ └── javax.annotation.processing.Processor └── settings.gradle /.gitignore: -------------------------------------------------------------------------------- 1 | .gradle 2 | /local.properties 3 | /.idea 4 | .DS_Store 5 | /build 6 | /captures 7 | -------------------------------------------------------------------------------- /.idea/.name: -------------------------------------------------------------------------------- 1 | Courier -------------------------------------------------------------------------------- /.idea/compiler.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | -------------------------------------------------------------------------------- /.idea/copyright/profiles_settings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /.idea/encodings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /.idea/gradle.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 27 | 28 | -------------------------------------------------------------------------------- /.idea/misc.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 19 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 46 | -------------------------------------------------------------------------------- /.idea/modules.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /.idea/runConfigurations.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 11 | 12 | -------------------------------------------------------------------------------- /.idea/vcs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /Courier.iml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Courier 2 | 相信大家很多时候。在Activity进行页面传值时。很苦恼,需要定义各种各样的KEY定义传递数据。在传递时如果参数较多。还得需要到目标Activity中去寻找传递的数据应该是怎么传递才是符合逻辑的。某条数据。应该如何传。才是符合逻辑的。现在好了。有了此框架的加入。相信定能使你的Activity代码更加简洁易懂。再遇到界面跳转传递参数过多的情况。那都不叫事! 3 | 4 | Courier框架使用编译时注解处理。绿色无反射。完全不用担心你的运行效率问题 5 | 6 | 如何引进Courier: 7 | 8 | - 在工程的根目录的build.gradle中加入: 9 | ``` 10 | classpath 'com.neenbedankt.gradle.plugins:android-apt:1.4' 11 | ``` 12 | - 在要使用的工程module中添加应用apt插件 13 | 14 | ``` 15 | apply plugin: 'com.neenbedankt.android-apt' 16 | ``` 17 | - 加入引用: 18 | 19 | ``` 20 | dependencies { 21 | ... 22 | compile 'org.lzh.compiler.courier:courier-api:0.3' 23 | apt 'org.lzh.compiler.courier:courier-compiler:0.3' 24 | } 25 | ``` 26 | 27 | [具体使用姿势](./USAGE.md) 28 | ####新创建一个QQ群以做交流.欢迎各位加入交流分享:108895031 29 | -------------------------------------------------------------------------------- /USAGE.md: -------------------------------------------------------------------------------- 1 | Courier框架用于使用编译时注解的方式.生成具体的java类做Activity与Fragment的传值跳转. 2 | 3 | ### Courier框架注解介绍 4 | 5 | Courier框架包含两种可用的注解.@Params与@Field. 6 | 7 | - @Params 可对Activity类或者Fragment类使用.如: 8 | 9 | ``` 10 | @Params 11 | public class EmptyActivity extends Activity { 12 | ... 13 | } 14 | ``` 15 | 16 | ``` 17 | @Params 18 | public class EmptyFragment extends Fragment { 19 | ... 20 | } 21 | ``` 22 | 23 | - @Field 使用于@Params注解中.作为对可传参数的声明.如: 24 | 25 | ``` 26 | @Params(fields = { 27 | @Field(name = "username",type = String.class,doc = "用户名"), 28 | @Field(name = "password",type = String.class,doc = "密码"), 29 | }) 30 | public class ParamsActivity extends Activity { 31 | ... 32 | } 33 | ``` 34 | 35 | 对Activity或者Fragment进行注解添加或修改后.需要点击Android Studio的build/make project 进行apt代码生成: 36 | 37 | ![](./capture/make_project.png) 38 | 39 | 生成类规则: 40 | 41 | - 若为对Activity类XXX使用,生成类名为XXXDispatcher, 42 | - 若为对Fragment类XXX使用,生成类名为XXXBuilder. 43 | - 获取传递到XXX类中的参数.均使用生成类XXXArgsData进行获取 44 | 45 | #### @Params与@Field使用参数介绍: 46 | 47 | ``` 48 | public @interface Params { 49 | // 需要传递的所有参数的集合. 50 | Field[] fields() default {}; 51 | 52 | // 指定是否让子类继承该注解中定义的fields参数集合 53 | boolean inherited() default true; 54 | } 55 | ``` 56 | 57 | ``` 58 | public @interface Field { 59 | // 必填项,需要生成的传递参数的名字 60 | String name(); 61 | 62 | // 必填项,需要生成的传递参数的类型,可为基本数据类型或者实现了Serializable接口的可序死化对象. 63 | Class type(); 64 | 65 | // 用于指定生成类中对于传递参数的doc注释. 66 | String doc() default ""; 67 | 68 | // 用于指定此参数的默认值. 69 | String defValue() default ""; 70 | 71 | // 与type结合使用,指定需要传递参数的真正类型, 72 | // eg.以type = String.class为例: 73 | // type fieldtype realtype 74 | // String + FieldType.Serializable = String 75 | // String + FieldType.list = List 76 | // String + FieldType.set = Set 77 | // String + FieldType.array = String[] 78 | FieldType fieldType() default FieldType.Serializable; 79 | 80 | } 81 | 82 | ``` 83 | 84 | 以Activity为例,使用方式: 85 | 86 | 对Activity类使用@Params注解 87 | 88 | ``` 89 | @Params 90 | public class EmptyActivity extends Activity { 91 | @Override 92 | protected void onCreate(Bundle savedInstanceState) { 93 | super.onCreate(savedInstanceState); 94 | setContentView(R.layout.activity_second); 95 | } 96 | } 97 | ``` 98 | 99 | 此处未含有需要传递的参数.故只使用了@Params注解. 100 | 101 | make project生成完成后即可在任意界面进行如下链式调用进行页面跳转: 102 | 103 | ``` 104 | EmptyActivityDispatcher.create().start(MainActivity.this); 105 | ``` 106 | 107 | 若为需要传递参数的界面.则对@Params注解中加入@Field注解: 108 | 109 | ``` 110 | @Params(fields = { 111 | @Field(name = "username",type = String.class,doc = "用户名",defValue = "admin"), 112 | @Field(name = "password",type = String.class,doc = "密码"), 113 | }) 114 | public class ParamsActivity extends Activity { 115 | 116 | @Bind(R.id.username) 117 | TextView username; 118 | @Bind(R.id.password) 119 | TextView password; 120 | 121 | @Override 122 | protected void onCreate(Bundle savedInstanceState) { 123 | super.onCreate(savedInstanceState); 124 | setContentView(R.layout.activity_params); 125 | ButterKnife.bind(this); 126 | // 获取传参 127 | ParamsActivityArgsData data = ParamsActivityArgsData.getArguments(getIntent()); 128 | // 获取传过来的username,password. 129 | username.setText(data.getUsername()); 130 | password.setText(data.getPassword()); 131 | 132 | } 133 | } 134 | ``` 135 | 136 | 可以看到.此处使用ParamsActivityArgsData类对传递过来的参数进行获取. 137 | 138 | 在需要传递跳转的页面进行如下调用进行快速跳转: 139 | 140 | ``` 141 | ParamsActivityDispatcher.create() 142 | .setUsername("123456") 143 | .setPassword("111111") 144 | .requestCode(-1) 145 | .start(this); 146 | ``` 147 | 148 | 由于我们在定义时.对参数字段username,password添加了doc说明,在使用ParamsActivityDispatcher进行set操作时.可以看到此处设置的doc文档. 149 | 150 | ![username](./capture/doc_username.png) 151 | 152 | ![password](./capture/doc_password.png) 153 | 154 | Courier可传值的参数类型.由Field注解中的type与fieldType共同指定, 155 | type为实现了Serializable接口的类class,fieldType指定外层包裹.如: 156 | 157 | ``` 158 | @Params(fields = { 159 | // User为实现了Serializable接口的实体类 160 | @Field(name = "admin", type = User.class),// 此处未写fieldType.因为fieldType未写时默认使用FieldType.Serializable,此时实际传参类型为type本身的User类型, 161 | @Field(name = "listUser", type = User.class, fieldType = FieldType.list),// 此时传参类型为List列表 162 | @Field(name = "arrayUser", type = User.class, fieldType = FieldType.array),// 此时实际传参数类型为User[]数组 163 | @Field(name = "setUser", type = User.class, fieldType = FieldType.set)// 此时实际传参类型为Set集合 164 | }) 165 | public class MultiTypeActivity extends Activity { 166 | 167 | @Bind(R.id.userInfos) 168 | TextView userInfos; 169 | 170 | @Override 171 | protected void onCreate(Bundle savedInstanceState) { 172 | super.onCreate(savedInstanceState); 173 | setContentView(R.layout.activity_multi_type); 174 | ButterKnife.bind(this); 175 | MultiTypeActivityArgsData arguments = MultiTypeActivityArgsData.getArguments(getIntent()); 176 | StringBuffer buffer = new StringBuffer(); 177 | buffer.append("admin:" + arguments.getAdmin()) 178 | .append("\n") 179 | .append("listUser:" + arguments.getListUser()) 180 | .append("\n") 181 | .append("arrsyUser:" + Arrays.toString(arguments.getArrayUser())); 182 | userInfos.setText(buffer.toString()); 183 | } 184 | } 185 | 186 | // 要传递参数到MultiTypeActivity,如下调用: 187 | MultiTypeActivityDispatcher.create() 188 | .setAdmin(new User("张三","密码0")) 189 | .setArrayUser(new User[]{new User("李四", "密码1")}) 190 | .setListUser(Arrays.asList(new User[]{new User("王五","密码")})) 191 | .setSetUser(new HashSet()) 192 | .start(this); 193 | ``` 194 | 195 | 对于使用于Fragment之上时.注解使用形式与Activity使用基本一致: 196 | 197 | ``` 198 | @Params(fields = { 199 | @Field(name = "password", type = String.class, doc = "用户密码") 200 | }) 201 | public class SubFragment extends TestFragment { 202 | public static final String TAG = SubFragment.class.getCanonicalName(); 203 | SubFragmentArgsData requestData; 204 | 205 | @Override 206 | public void onCreate(Bundle savedInstanceState) { 207 | super.onCreate(savedInstanceState); 208 | requestData = SubFragmentArgsData.getArguments(this); 209 | } 210 | 211 | @Override 212 | public void onViewCreated(View view, Bundle savedInstanceState) { 213 | super.onViewCreated(view, savedInstanceState); 214 | password.setText(requestData.getPassword()); 215 | } 216 | } 217 | ``` 218 | 219 | 不同点在于传参时使用方式不同: 220 | 221 | ``` 222 | SubFragment build = SubFragmentBuilder.create() 223 | .setPassword("SubFragment pass : password") 224 | .build(); 225 | getFragmentManager().beginTransaction() 226 | .replace(R.id.frag_layout,build) 227 | .commit(); 228 | ``` 229 | 230 | 当然.在某些时候.我们并不需要直接一步直接生成Fragment实例或者直接跳转页面,我们只需要获取Activity需要传递的Intent或者Fragment的Bundle实例. 231 | 232 | ``` 233 | Bundle fragPass = SubFragmentBuilder.create().setPassword("password").createBundle(); 234 | Intent actPass = ParamsActivityDispatcher.create().setPassword("password").createIntent(this,true); 235 | ``` -------------------------------------------------------------------------------- /api/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /api/api.iml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 8 | 9 | 10 | 11 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | -------------------------------------------------------------------------------- /api/build.gradle: -------------------------------------------------------------------------------- 1 | import com.sun.org.apache.xalan.internal.xsltc.cmdline.Compile 2 | 3 | apply plugin: 'java' 4 | apply plugin: 'com.novoda.bintray-release'//添加 5 | 6 | sourceCompatibility = JavaVersion.VERSION_1_7 7 | targetCompatibility = JavaVersion.VERSION_1_7 8 | dependencies { 9 | 10 | } 11 | 12 | tasks.withType(Compile) { 13 | options.encoding = "UTF-8" 14 | } 15 | 16 | javadoc { 17 | options{ 18 | encoding "UTF-8" 19 | charSet 'UTF-8' 20 | author true 21 | version true 22 | links "http://docs.oracle.com/javase/7/docs/api" 23 | 24 | } 25 | } 26 | 27 | //添加 28 | publish { 29 | artifactId = 'courier-api' 30 | userOrg = rootProject.userOrg 31 | groupId = rootProject.groupId 32 | uploadName = rootProject.uploadName 33 | publishVersion = rootProject.publishVersion 34 | desc = rootProject.description 35 | website = rootProject.website 36 | licences = rootProject.licences 37 | } 38 | -------------------------------------------------------------------------------- /api/src/main/java/com/lzh/courier/annoapi/Field.java: -------------------------------------------------------------------------------- 1 | package com.lzh.courier.annoapi; 2 | 3 | import java.lang.annotation.ElementType; 4 | import java.lang.annotation.Inherited; 5 | import java.lang.annotation.Retention; 6 | import java.lang.annotation.RetentionPolicy; 7 | import java.lang.annotation.Target; 8 | 9 | /** 10 | * @author Administrator 11 | */ 12 | @Inherited 13 | @Target({ElementType.TYPE}) 14 | @Retention(RetentionPolicy.RUNTIME) 15 | public @interface Field { 16 | /** 17 | * field name 18 | */ 19 | String name(); 20 | 21 | /** 22 | * field type,to indicate the real type you need pass.this type will used with {fieldType} 23 | */ 24 | Class type(); 25 | 26 | /** 27 | * field javadoc,to generate java doc in java code 28 | */ 29 | String doc() default ""; 30 | 31 | /** 32 | * default value.to generate this field default value in ArgsData class 33 | */ 34 | String defValue() default ""; 35 | 36 | /** 37 | * associate with {type},to indicate the real type you want:
38 | * rules:
39 | * Serializable + type : {type}
40 | * list + type : List<type>
41 | * set + type : Set<type>
42 | * array + type : type[] 43 | */ 44 | FieldType fieldType() default FieldType.Serializable; 45 | 46 | } 47 | -------------------------------------------------------------------------------- /api/src/main/java/com/lzh/courier/annoapi/FieldType.java: -------------------------------------------------------------------------------- 1 | package com.lzh.courier.annoapi; 2 | 3 | /** 4 | * @author Administrator 5 | */ 6 | public enum FieldType { 7 | Serializable, 8 | list, 9 | set, 10 | array 11 | } 12 | -------------------------------------------------------------------------------- /api/src/main/java/com/lzh/courier/annoapi/Params.java: -------------------------------------------------------------------------------- 1 | package com.lzh.courier.annoapi; 2 | 3 | 4 | import java.lang.annotation.ElementType; 5 | import java.lang.annotation.Retention; 6 | import java.lang.annotation.RetentionPolicy; 7 | import java.lang.annotation.Target; 8 | 9 | /** 10 | * @author Administrator 11 | */ 12 | @Target({ElementType.TYPE}) 13 | @Retention(RetentionPolicy.CLASS) 14 | public @interface Params { 15 | /** 16 | * define all of the fields to pass; 17 | */ 18 | Field[] fields() default {}; 19 | 20 | /** 21 | * indicated whether or not to generate params setter with subClass use {@link Params}.default is true.
22 | * - when set to false,subClass generated builder will be disable all of fields defined by parent class
23 | * 24 | * ps:this feature is not apply to activity 25 | */ 26 | boolean inherited() default true; 27 | } 28 | -------------------------------------------------------------------------------- /app/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /app/app.iml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 8 | 9 | 10 | 11 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | -------------------------------------------------------------------------------- /app/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: 'com.android.application' 2 | apply plugin: 'com.neenbedankt.android-apt' 3 | android { 4 | compileSdkVersion 23 5 | buildToolsVersion "23.0.2" 6 | 7 | defaultConfig { 8 | applicationId "org.lzh.framework.courier" 9 | minSdkVersion 14 10 | targetSdkVersion 23 11 | versionCode 1 12 | versionName "1.0" 13 | } 14 | buildTypes { 15 | release { 16 | minifyEnabled false 17 | proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 18 | } 19 | } 20 | } 21 | 22 | dependencies { 23 | // compile project(':api') 24 | // apt project(':processor') 25 | compile 'com.jakewharton:butterknife:7.0.1' 26 | compile 'org.lzh.compiler.courier:courier-api:0.3' 27 | apt 'org.lzh.compiler.courier:courier-compiler:0.3' 28 | compile 'com.android.support:support-v4:23.1.1' 29 | } 30 | -------------------------------------------------------------------------------- /app/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # By default, the flags in this file are appended to flags specified 3 | # in D:\android_developers\Tools\android-sdk_high/tools/proguard/proguard-android.txt 4 | # You can edit the include path and order by changing the proguardFiles 5 | # directive in build.gradle. 6 | # 7 | # For more details, see 8 | # http://developer.android.com/guide/developing/tools/proguard.html 9 | 10 | # Add any project specific keep options here: 11 | 12 | # If your project uses WebView with JS, uncomment the following 13 | # and specify the fully qualified class name to the JavaScript interface 14 | # class: 15 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 16 | # public *; 17 | #} 18 | -------------------------------------------------------------------------------- /app/src/androidTest/java/org/lzh/framework/courier/ApplicationTest.java: -------------------------------------------------------------------------------- 1 | package org.lzh.framework.courier; 2 | 3 | import android.app.Application; 4 | import android.test.ApplicationTestCase; 5 | 6 | /** 7 | * Testing Fundamentals 8 | */ 9 | public class ApplicationTest extends ApplicationTestCase { 10 | public ApplicationTest() { 11 | super(Application.class); 12 | } 13 | } -------------------------------------------------------------------------------- /app/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | -------------------------------------------------------------------------------- /app/src/main/java/org/lzh/framework/courier/EmptyActivity.java: -------------------------------------------------------------------------------- 1 | package org.lzh.framework.courier; 2 | 3 | import android.app.Activity; 4 | import android.os.Bundle; 5 | 6 | import com.lzh.courier.annoapi.Params; 7 | // 只添加@Params, 8 | @Params 9 | public class EmptyActivity extends Activity { 10 | @Override 11 | protected void onCreate(Bundle savedInstanceState) { 12 | super.onCreate(savedInstanceState); 13 | setContentView(R.layout.activity_second); 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /app/src/main/java/org/lzh/framework/courier/MainActivity.java: -------------------------------------------------------------------------------- 1 | package org.lzh.framework.courier; 2 | 3 | import android.app.Activity; 4 | import android.content.Intent; 5 | import android.os.Bundle; 6 | 7 | import org.lzh.framework.courier.model.User; 8 | 9 | import java.util.Arrays; 10 | import java.util.HashSet; 11 | 12 | import butterknife.ButterKnife; 13 | import butterknife.OnClick; 14 | 15 | public class MainActivity extends Activity { 16 | 17 | @Override 18 | protected void onCreate(Bundle savedInstanceState) { 19 | super.onCreate(savedInstanceState); 20 | setContentView(R.layout.activity_main); 21 | ButterKnife.bind(this); 22 | } 23 | 24 | @OnClick(R.id.toEmptyParamsActivity) 25 | void toEmptyActivity() { 26 | // start跳转支持以Activity/Context/Fragment/V4Fragment进行跳转 27 | EmptyActivityDispatcher.create().requestCode(-1).start(MainActivity.this); 28 | } 29 | 30 | @OnClick(R.id.toParamsActivity) 31 | void toParamaActivity () { 32 | ParamsActivityDispatcher.create() 33 | .setUsername("123456") 34 | .setPassword("111111") 35 | .requestCode(-1) 36 | .start(this); 37 | 38 | } 39 | 40 | @OnClick(R.id.toMultiTypeActivity) 41 | void toMultiTypeActivity () { 42 | MultiTypeActivityDispatcher.create() 43 | .setAdmin(new User("张三","密码0")) 44 | .setArrayUser(new User[]{new User("李四", "密码1")}) 45 | .setListUser(Arrays.asList(new User[]{new User("王五","密码")})) 46 | .setSetUser(new HashSet()) 47 | .start(this); 48 | } 49 | 50 | @OnClick(R.id.toParentActivity) 51 | void toParentActivity() { 52 | ParentActivityDispatcher.create() 53 | .setUsername("ParentActivity pass : username") 54 | .start(this); 55 | } 56 | 57 | @OnClick(R.id.toSubActivity) 58 | void toSubActivity() { 59 | SubActivityDispatcher.create() 60 | .setUsername("SubActivity pass : username") 61 | .setPassword("SubActivity pass : password") 62 | .start(this); 63 | } 64 | 65 | @OnClick(R.id.toParentFragment) 66 | void toParentFragment () { 67 | TestFragment build = TestFragmentBuilder.create().setUsername("TestFragment pass : username") 68 | .build(); 69 | 70 | getFragmentManager().beginTransaction() 71 | .replace(R.id.frag_layout, build) 72 | .commit(); 73 | } 74 | 75 | @OnClick(R.id.toSubFragment) 76 | void toSubFragment () { 77 | SubFragment build = SubFragmentBuilder.create() 78 | .setPassword("SubFragment pass : password") 79 | .build(); 80 | 81 | 82 | 83 | getFragmentManager().beginTransaction() 84 | .replace(R.id.frag_layout,build) 85 | .commit(); 86 | } 87 | } 88 | -------------------------------------------------------------------------------- /app/src/main/java/org/lzh/framework/courier/MultiTypeActivity.java: -------------------------------------------------------------------------------- 1 | package org.lzh.framework.courier; 2 | 3 | import android.app.Activity; 4 | import android.os.Bundle; 5 | import android.widget.TextView; 6 | 7 | import com.lzh.courier.annoapi.Field; 8 | import com.lzh.courier.annoapi.FieldType; 9 | import com.lzh.courier.annoapi.Params; 10 | 11 | import org.lzh.framework.courier.model.User; 12 | 13 | import java.util.Arrays; 14 | 15 | import butterknife.Bind; 16 | import butterknife.ButterKnife; 17 | 18 | @Params(fields = { 19 | @Field(name = "admin", type = User.class), 20 | @Field(name = "listUser", type = User.class, fieldType = FieldType.list), 21 | @Field(name = "arrayUser", type = User.class, fieldType = FieldType.array), 22 | @Field(name = "setUser", type = User.class, fieldType = FieldType.set) 23 | }) 24 | public class MultiTypeActivity extends Activity { 25 | 26 | @Bind(R.id.userInfos) 27 | TextView userInfos; 28 | 29 | @Override 30 | protected void onCreate(Bundle savedInstanceState) { 31 | super.onCreate(savedInstanceState); 32 | setContentView(R.layout.activity_multi_type); 33 | ButterKnife.bind(this); 34 | MultiTypeActivityArgsData arguments = MultiTypeActivityArgsData.getArguments(getIntent()); 35 | StringBuffer buffer = new StringBuffer(); 36 | buffer.append("admin:" + arguments.getAdmin()) 37 | .append("\n") 38 | .append("listUser:" + arguments.getListUser()) 39 | .append("\n") 40 | .append("arrsyUser:" + Arrays.toString(arguments.getArrayUser())); 41 | userInfos.setText(buffer.toString()); 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /app/src/main/java/org/lzh/framework/courier/ParamsActivity.java: -------------------------------------------------------------------------------- 1 | package org.lzh.framework.courier; 2 | 3 | import android.app.Activity; 4 | import android.os.Bundle; 5 | import android.widget.TextView; 6 | 7 | import com.lzh.courier.annoapi.Field; 8 | import com.lzh.courier.annoapi.Params; 9 | 10 | import butterknife.Bind; 11 | import butterknife.ButterKnife; 12 | // 含带参数的跳转。 13 | @Params(fields = { 14 | @Field(name = "username",type = String.class,doc = "用户名",defValue = "admin"), 15 | @Field(name = "password",type = String.class,doc = "密码"), 16 | }) 17 | public class ParamsActivity extends Activity { 18 | 19 | @Bind(R.id.username) 20 | TextView username; 21 | @Bind(R.id.password) 22 | TextView password; 23 | 24 | @Override 25 | protected void onCreate(Bundle savedInstanceState) { 26 | super.onCreate(savedInstanceState); 27 | setContentView(R.layout.activity_params); 28 | ButterKnife.bind(this); 29 | // 获取传参 30 | ParamsActivityArgsData data = ParamsActivityArgsData.getArguments(getIntent()); 31 | username.setText(data.getUsername()); 32 | password.setText(data.getPassword()); 33 | 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /app/src/main/java/org/lzh/framework/courier/ParentActivity.java: -------------------------------------------------------------------------------- 1 | package org.lzh.framework.courier; 2 | 3 | import android.app.Activity; 4 | import android.os.Bundle; 5 | import android.widget.Button; 6 | 7 | import com.lzh.courier.annoapi.Field; 8 | import com.lzh.courier.annoapi.Params; 9 | 10 | import butterknife.Bind; 11 | import butterknife.ButterKnife; 12 | 13 | @Params(fields = { 14 | @Field(name = "username", type = String.class) 15 | }) 16 | public class ParentActivity extends Activity { 17 | 18 | @Bind(R.id.username) 19 | Button username; 20 | @Bind(R.id.password) 21 | Button password; 22 | 23 | @Override 24 | protected void onCreate(Bundle savedInstanceState) { 25 | super.onCreate(savedInstanceState); 26 | setContentView(R.layout.activity_parent); 27 | ButterKnife.bind(this); 28 | 29 | ParentActivityArgsData data = ParentActivityArgsData.getArguments(getIntent()); 30 | username.setText(data.getUsername()); 31 | 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /app/src/main/java/org/lzh/framework/courier/SubActivity.java: -------------------------------------------------------------------------------- 1 | package org.lzh.framework.courier; 2 | 3 | import android.os.Bundle; 4 | 5 | import com.lzh.courier.annoapi.Field; 6 | import com.lzh.courier.annoapi.Params; 7 | 8 | 9 | @Params(fields = { 10 | @Field(name = "password",type = String.class) 11 | }) 12 | public class SubActivity extends ParentActivity { 13 | 14 | @Override 15 | protected void onCreate(Bundle savedInstanceState) { 16 | super.onCreate(savedInstanceState); 17 | SubActivityArgsData data = SubActivityArgsData.getArguments(getIntent()); 18 | password.setText(data.getPassword()); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /app/src/main/java/org/lzh/framework/courier/SubFragment.java: -------------------------------------------------------------------------------- 1 | package org.lzh.framework.courier; 2 | 3 | import android.os.Bundle; 4 | import android.view.View; 5 | 6 | import com.lzh.courier.annoapi.Field; 7 | import com.lzh.courier.annoapi.Params; 8 | 9 | 10 | /** 11 | * @author Administrator 12 | */ 13 | @Params(fields = { 14 | @Field(name = "password", type = String.class, doc = "用户密码") 15 | }) 16 | public class SubFragment extends TestFragment { 17 | public static final String TAG = SubFragment.class.getCanonicalName(); 18 | SubFragmentArgsData requestData; 19 | 20 | @Override 21 | public void onCreate(Bundle savedInstanceState) { 22 | super.onCreate(savedInstanceState); 23 | requestData = SubFragmentArgsData.getArguments(this); 24 | } 25 | 26 | @Override 27 | public void onViewCreated(View view, Bundle savedInstanceState) { 28 | super.onViewCreated(view, savedInstanceState); 29 | password.setText(requestData.getPassword()); 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /app/src/main/java/org/lzh/framework/courier/TestFragment.java: -------------------------------------------------------------------------------- 1 | package org.lzh.framework.courier; 2 | 3 | import android.app.Fragment; 4 | import android.os.Bundle; 5 | import android.view.LayoutInflater; 6 | import android.view.View; 7 | import android.view.ViewGroup; 8 | import android.widget.Button; 9 | 10 | import com.lzh.courier.annoapi.Field; 11 | import com.lzh.courier.annoapi.Params; 12 | 13 | import butterknife.Bind; 14 | import butterknife.ButterKnife; 15 | 16 | /** 17 | * @author Administrator 18 | */ 19 | @Params( 20 | inherited = false, 21 | fields = { 22 | @Field(name = "username", type = CharSequence.class, defValue = "\"username\"",doc = "用户名") 23 | } 24 | ) 25 | public class TestFragment extends Fragment { 26 | 27 | @Bind(R.id.username) 28 | Button username; 29 | @Bind(R.id.password) 30 | Button password; 31 | 32 | TestFragmentArgsData requestData; 33 | 34 | @Override 35 | public void onCreate(Bundle savedInstanceState) { 36 | super.onCreate(savedInstanceState); 37 | requestData = TestFragmentArgsData.getArguments(this); 38 | } 39 | 40 | @Override 41 | public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 42 | View view = inflater.inflate(R.layout.activity_parent, container, false); 43 | ButterKnife.bind(this, view); 44 | return view; 45 | } 46 | 47 | @Override 48 | public void onViewCreated(View view, Bundle savedInstanceState) { 49 | username.setText(requestData.getUsername()); 50 | } 51 | 52 | @Override 53 | public void onDestroyView() { 54 | super.onDestroyView(); 55 | ButterKnife.unbind(this); 56 | } 57 | } 58 | -------------------------------------------------------------------------------- /app/src/main/java/org/lzh/framework/courier/model/User.java: -------------------------------------------------------------------------------- 1 | package org.lzh.framework.courier.model; 2 | 3 | import java.io.Serializable; 4 | 5 | /** 6 | * @author Administrator 7 | */ 8 | public class User implements Serializable{ 9 | 10 | private String username; 11 | private String password; 12 | 13 | public User(String username, String password) { 14 | this.username = username; 15 | this.password = password; 16 | } 17 | 18 | public String getUsername() { 19 | return username; 20 | } 21 | 22 | public void setUsername(String username) { 23 | this.username = username; 24 | } 25 | 26 | public String getPassword() { 27 | return password; 28 | } 29 | 30 | public void setPassword(String password) { 31 | this.password = password; 32 | } 33 | 34 | @Override 35 | public String toString() { 36 | return "User{" + 37 | "username='" + username + '\'' + 38 | ", password='" + password + '\'' + 39 | '}'; 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_main.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 10 | 11 |