Extra是Android标准的组件之间(Activity/Fragment/Service等)传递数据的方式。本文介绍了开源项目Dart的使用,它优雅的处理了组件间跳转和数据传递java
本文中所演示的例子sample代码位于DartHensonSampleandroid
会Android的人都会这个的,这里就简单说下,通常流程是git
getIntent().getXXXExtra()
得到数据intent.putExtra()
设置数据,并执行startActivity()
具体这里就不在贴上代码了,主要讲讲这里会致使的一些问题。github
必须的
,可是对于这个FirstActivity的做者可并不知道啊好在Dart这个开源项目顺利的处理了上述等问题,并且处理的很是优雅。app
Dart的原理和ButterKnife相似,都是经过注解处理器在编译阶段生成一些代码。因此你再写好一些注解后,必需要构建一些项目才能生成一些后面你所须要的代码(后面会详细说明)。maven
首先引入android-apt,在项目gradle中加入插件ide
buildscript { repositories { mavenCentral() } dependencies { classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8' } }
再在build.gradle引用gradle
apply plugin: 'android-apt'
引入Dart & Henson(Henson实际是Dart项目的子项目)ui
compile 'com.f2prateek.dart:dart:2.0.0' provided 'com.f2prateek.dart:dart-processor:2.0.0' compile 'com.f2prateek.dart:henson:2.0.0' provided 'com.f2prateek.dart:henson-processor:2.0.0'
这里咱们假设要从MainActivity跳转到DetailActivity,DetailActivity中要接受三个参数分别是String name
,int age
和User user
。这里的user是一个自定义类型,咱们知道要想传递数据,必须序列化,文的例子中引入了Parceler项目经过一样一个注解@Parcel
自动在编译器声场Parcelable的繁杂的代码:User.javathis
DetailActivity须要接受上述三个参数,仅仅经过@InjectExtra
注解便可,而后在onCreate
中执行Dart.inject(this)
,详细的代码为:
public class DetailActivity extends AppCompatActivity { @InjectExtra String name = "default name"; @InjectExtra int age = 0; @Nullable @InjectExtra User user; @BindView(R.id.tvName) TextView tvName; @BindView(R.id.tvAge) TextView tvAge; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_detail); ButterKnife.bind(this); Dart.inject(this); initView(); } private void initView() { // 使用name,age,user } }
String name = "default name";
这句话给了name一个默认值,可是当Dart.inject
执行后会被传递过来的数据覆盖。
@Nullable
加在了user上说明这个数据能够不用传递。接受端就这么多代码,下面让咱们看看发送端若是发送数据,如何跳转到DetailActivity。
注意编写上述代码后,咱们要先编译下项目,编译好后Henson会经过注解处理器生成能够跳转到DetailActivity的DSL(领域特定语言)段,方便其余组件对DetailActivity的跳转,咱们在MainActivity上只要写上下列代码,便可完成界面跳转和数据传递:
User user = new User(); user.setAge(Integer.parseInt(age.getText().toString())); user.setName(name.getText().toString()); startActivity( Henson.with(this) .gotoDetailActivity() .age(27) .name("jason") .user(user) .build() );
当你写完Henson.with(this)
后代码提示会自动弹出.gotoDetailActivity()
,Henson帮助你提示你DetailActivity是能够被跳转的;随后你继续写下.gotoDetailActivity()
后,又自动弹出.age()
方法,提示你传入一个int类型给age,写好后,又自动弹出.name()
方法,以此类推,最后以一个build()
收场。
注意,这里你能够不写.user()
,由于在DetailActivity中咱们指定它是nullable的,能够不传。可是.age()
和.name()
都是会强制弹出让你填写数据的。
至此,Henson&Dart的基本介绍结束。
Dart还有一个@HensonNavigable
注解,它标注在将会被跳转到的Activity的classname上,说明这个activity能够被跳转,会自动生成.gotoXXXActivity()
这样的代码,可是它不能在这个类中存在@InjectExtra注解,这里总以为这个注解有些多余。
第二,和Dart项目的做者提了issue问了关于参数指定的顺序问题,上述例子中咱们传递数据的代码是:
Henson.with(this) .gotoDetailActivity() .age(Integer.parseInt(age.getText().toString())) .name(name.getText().toString()) .build()
可是若是我偏向要对调name和age呢?发现不行~若是你写完.gotoDetailActivity()
后发现只有.age()
的提示,却没有.name()
的,即强制要求你先传递age。这里做者说明后才知道他们是按照字幕顺序来排数据传入的,目前没有更好的方法。
欢迎你开心的使用Dart & Henson!