Passing Data Between Two Fragments hosted by same activity

背景:

等同於前文中的利用Fragment argument

1) 將date信息從CrimeFragment傳送到DatePickerFragment

Step1: 在DatePickerFragment中添加newInstance方法

public static DatePickerFragment newInstance(Date date) {
    Bundle args = new Bundle();
    args.putSerializable(ARG_DATE, date);
    DatePickerFragment fragment = new DatePickerFragment();
    fragment.setArguments(args);
    return fragment;
}

Step2: 在CrimeFragment中調用上述方法

mDateButton.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        FragmentManager manager = getFragmentManager();
        DatePickerFragment dialog = DatePickerFragment.newInstance(mCrime.getDate());
        //建立CrimeFragment與DatePickerFragment之間的關係。以便CrimeFragment接收傳回的date信息
        dialog.setTargetFragment(CrimeFragment.this, REQUEST_DATE);
        dialog.show(manager, DIALOG_DATE);
    }
});

Step3: 在DatePickerFragment中檢索date信息

public Dialog onCreateDialog(Bundle savedInstanceState) {
    Date date=(Date)getArguments().getSerializable(ARG_DATE);
......
}

2) 將date信息從DatePickerFragment傳送回CrimeFragment

1) 利用target建立CrimeFragment與DatePickerFragment之間的關係

mDateButton.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        FragmentManager manager = getFragmentManager();
        DatePickerFragment dialog = DatePickerFragment.newInstance(mCrime.getDate());
        //建立CrimeFragment與DatePickerFragment之間的關係。以便CrimeFragment接收傳回的date信息
        dialog.setTargetFragment(CrimeFragment.this, REQUEST_DATE);
        dialog.show(manager, DIALOG_DATE);
    }
});

2)在DatePickerFragment利用建立的關係調用target fragment的方法以返回信息

private void sendResult(int resultCode, Date date) {
    if (getTargetFragment() == null) {
        return;
    }
    Intent intent = new Intent();
    intent.putExtra(EXTRA_DATE, date);
    getTargetFragment().onActivityResult(getTargetRequestCode(), resultCode, intent);
}

3)用戶點擊OK鍵之後調用sendResult方法

return new AlertDialog.Builder(getActivity())
        .setView(v)
        .setTitle(R.string.date_picker_title)
        .setPositiveButton(android.R.string.ok,
                new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        int year = mDatePicker.getYear();
                        int month = mDatePicker.getMonth();
                        int day = mDatePicker.getDayOfMonth();
                        Date date = new GregorianCalendar(year, month, day).getTime();
                        sendResult(Activity.RESULT_OK, date);
                    }
                })
        .create();

4)在CrimeFragment中調用onActivityResult方法來獲取返回的信息

public void onActivityResult(int requestCode, int resultCode, Intent data) {
    //用於接收關聯的fragment傳送回的消息。
    //此fragment所屬的activity在調用本身的onActivityResult時,activity的FragmentManager將調用這裏的方法
    if (resultCode != Activity.RESULT_OK) {
        return;
    }
    if (requestCode == REQUEST_DATE) {
        Date date = (Date) data.getSerializableExtra(DatePickerFragment.EXTRA_DATE);
        mCrime.setDate(date);
        updateDate();
    }
}

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章