天天看點

使用fragment argument

從fragment中啟動activity

@Override
    public void onListItemClick(ListView l, View v, int position, long id) {
        super.onListItemClick(l, v, position, id);

        Crime crime = (Crime) getListAdapter().getItem(position);

        Intent intent = new Intent(getActivity(), CrimeActivity.class);
        //UUID是Serializable對象,我們調用了可接受Serializable對象的putExtra(...)方法,即putExtra(String, Serializable)方法。
        intent.putExtra(CrimeFragment.EXTRA_CRIME_ID, crime.getId());
        /**
         * 從fragment中啟動activity,可以調用Fragment.startActivity(Intent)方法。
         * 
         * 除了将傳回結果從托管activity傳遞給fragment的額外實作代碼之外,Fragment.startActivityForResult(Intent, int)方法的實作代碼與activity的同名方法基本相同。
         */
        startActivityForResult(intent, REQUEST_CRIME);
    }
           

fragment擷取儲存在activity的intent内的資料資訊

/**
     * 
     * fragment有兩種方式擷取儲存在activity的intent内的資料資訊
     * 方式一:即直接在fragment中調用getActivity().getIntent()方法擷取托管Activity的intent,然後為extra添加key,得到intent内的extra資訊。
     *       但該方法犧牲了fragment的封裝性,fragment不再是可複用的建構單元,因為它總需要由某個具體activity托管着。
     * 方式二:先建立Bundle對象,将activity的intent内的資料資訊argument添加到bundle中,再調用Fragment.setArguments(Bundle)方法,
     *       因為每一個fragment執行個體都可附帶一個Bundle對象。如下代碼既是。
     *       
     * 注意:互動的activit和fragment不需要也無法同時保持通用獨立性。托管activity就應該知道有關托管fragment方法的細節,
     *     但fragment則不必知道其托管activity的細節問題。
     */
    public static Fragment newInstance(UUID crimeId){
        Bundle bundle = new Bundle();
        bundle.putSerializable(EXTRA_CRIME_ID, crimeId);

        CrimeFragment fragment = new CrimeFragment();
        fragment.setArguments(bundle);

        return fragment;
    }
           
@Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        //UUID crimeId = (UUID) getActivity().getIntent().getSerializableExtra(EXTRA_CRIME_ID);


        UUID crimeId = (UUID) getArguments().getSerializable(EXTRA_CRIME_ID);
        mCrime = CrimeLab.get(getActivity()).getCrime(crimeId);
    }
           
public class CrimeActivity extends SingleFragmentActivity {

    @Override
    protected Fragment createFragment() {
        UUID crimeId = (UUID) getIntent().getSerializableExtra(CrimeFragment.EXTRA_CRIME_ID);
        return CrimeFragment.newInstance(crimeId);
    }

}
           

從fragment中傳回結果

/**
     * fragment能夠從activity中接收傳回結果,但其自身無法産生傳回結果。隻有activity擁有傳回結果。
     * 是以,盡管Fragment有自己的startActivityForResult(Intent,int)和onActivityResult(...)方法,
     * 但卻不具有任何setResult(...)方法。
     */
    getActivity().setResult(Activity.RESULT_OK, null);
           

代碼位址

繼續閱讀