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!