天天看点

使用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);
           

代码地址

继续阅读