Android中Activity與Fragment之間資料相互傳遞
一、Activity啟動Activity
Intent intent = new Intent(this,MainListActivity.class);
startActivity(intent);
Activity與Activity傳遞資料
Intent intent = new Intent(this,MainListActivity.class);
// 可直接呼叫putXxx()方法 或 建立Bundle物件,完成引數傳遞
intent.putString(TAG,"data");
intent.putExtra(TAG,0);
...
startActivity(intent);
這樣傳遞沒什麼問題,為了更好地實現模組獨立,我們可以在被啟動的Activity(MainListActivity)中建立一個static方法來啟動。把傳遞的引數放到newIntent()方法的引數中傳遞,這樣需要啟動DetailActivity的Activity就不用處理具體的業務邏輯,相關的操作都由DetailActivity實現。
public static final String EXTRA_CRIME_ID = "com.demo.happy.criminal.crime_id";
// 需要傳遞的資料,直接放在引數中即可
public static Intent newIntent (Context packageContext, UUID crime_id){
Intent intent = new Intent(context,DetailActivity.class);
intent.putExtra(EXTRA_CRIME_ID,crime_id);
return intent;
}
這樣我們只需在DetailActivity中呼叫newIntent(),該方法傳入需要傳遞的資料即可
Intent intent = DetailActivity.newIntent(getActivity(),crimeId);
startActivity(intent);
二、從Fragment中啟動Activity
Fragment啟動Activity類似於Activity啟動Activity,直接呼叫fragment.startActivity(Intent),然後在後臺觸發呼叫對應的Activity方法。
和Activity中啟動方法一樣,此處程式碼省略
資料傳遞
在實際應用中,我們不僅要啟動某個Activity或者Fragment,更多是它們之間的資料傳遞。
1)Activity獲取Fragment中的資料
把所需要的引數作為newIntent()的引數傳遞過去
Fragment
Intent intent = MainActivity.newIntent(getActivity(), id);
Activity
public static Intent newIntent(Context context, UUID crime_id){
Intent intent = new Intent(context,MainActivity.class);
intent.putExtra(EXTRA_CRIME_ID,crime_id);
return intent;
}
2)Fragment獲取Activity中的資料
首先呢,我們可以通過Intent,直接攜帶引數傳遞,簡單、方便。然而這種方法破壞了fragment的封裝性,MainFragment不再是獨立的構建單元,因為它現在由某個特定的activity託管,該activity的Intent定義了EXTRA_CRIME_ID的Extra無法在適用於其他任何activity
Activity
public static Intent newIntent(Context context, UUID crime_id){
Intent intent = new Intent(context,MainActivity.class);
intent.putExtra(EXTRA_CRIME_ID,crime_id);
return intent;
}
Fragment
UUID crimeId = (UUID) getActivity().getIntent().getSerializableExtra(MainActivity.EXTRA_CRIME_ID)
crime = CrimeLab.get(getActivity()).getCrime(crimeId);
第二種方法,附加argument給fragment,呼叫Fragmen.setArguments(Bundle)方法,而且必須在ftagment建立後,新增activity(託管fragment的activity)前完成。
也就是說,再建立MainFragment例項時,直接把傳遞的資料傳遞過去,直接在MainFragment裡面呼叫獲取資料,所有的業務邏輯都在MainFragment裡面實現,實現了模組的獨立性。
public static MainFragment newInstance(UUID crime_id) {
Bundle bundle = new Bundle();
bundle.putSerializable(ARG_CRIME_ID, crime_id);
MainFragment fragment = new MainFragment();
fragment.setArguments(bundle);
return fragment;
}
獲取argument
先呼叫Fragment的getArguments()方法,再呼叫Bundle的限定型別getXxx()方法
UUID crimeId = (UUID) getArguments().getSerializable(ARG_CRIME_ID);
crime = CrimeLab.get(getActivity()).getCrime(crimeId);
其實為了更好的實現模組的獨立性,都是在獲取資料的Activity或Fragment中建立靜態方法實現具體的業務邏輯,而設定資料的Activity或Fragment負責呼叫靜態方法,把需要傳遞的資料放入引數中即可。