1. 程式人生 > >Android中Activity與Fragment之間資料相互傳遞

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負責呼叫靜態方法,把需要傳遞的資料放入引數中即可。