I've searched for "setTargetFragment" and read the existing posts for answers, such as:
Communication between two fragments - which is right way?
Communicate between fragment and fragment dialog
Android - getTargetFragment and setTargetFragment - What are they used for
I am going through Big Nerd Ranch's "Android Programming" and have a question about communications between fragments. Specifically, in chapter 12 a DialogFragment is used to reset the date of a "crime" depending on screen size:
public class CrimeFragment extends Fragment {
...
if (ScreenSize < 2080 ) {
DatePickerFragment dialog = DatePickerFragment
.newInstance(mCrime.getDate());
dialog.setTargetFragment(CrimeFragment.this, REQUEST_DATE);
dialog.show(manager, DIALOG_DATE);
} else {
date = mCrime.getDate();
id = mCrime.getId();
Intent intent = new Intent(getContext(), DatePickerActivity.class);
intent.putExtra(EXTRA_DATE, date);
startActivityForResult(intent, REQUEST_DATE);
}
The DatePickerFragment is created below from a call in DatePickerActivity:
public class DatePickerActivity extends SingleFragmentActivity {
private final String TAG = "DatePickerActivity";
private static final int REQUEST_DATE = 0;
@Override
protected Fragment createFragment() {
Intent intent = getIntent();
Date date = (Date) intent.getSerializableExtra(CrimeFragment.EXTRA_DATE);
return DatePickerFragment.newInstance(date);
}
}
newInstance:
public class DatePickerFragment extends DialogFragment {
...
public static DatePickerFragment newInstance(Date date){
Bundle args = new Bundle();
args.putSerializable(EXTRA_DATE, date);
DatePickerFragment fragment = new DatePickerFragment();
fragment.setArguments(args);
return fragment;
}
onClick is supposed to send the date in the Dialog is supposed to be sent back to the calling function CrimeFragment, but it isn't because the calling fragment is not set, so getTargetFragment == null
as seen in the code from DatePickerFragment below:
public void onClick(View v) {
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);
}
});
return v;
}
private void sendResult(int resultCode, Date date){
if(getTargetFragment() == null){
Log.d(TAG + "/sendResult", "getTargetFragment = null");
Log.d(TAG + "/sendResult", "getTargetFragment actual value: " + String.valueOf(getTargetFragment()));
return;
}
Log.d(TAG + "/sendResult", "getTargetFragment = " + String.valueOf(getTargetFragment()));
Intent intent = new Intent();
intent.putExtra(EXTRA_DATE, date);
getTargetFragment().onActivityResult(getTargetRequestCode(), resultCode, intent);
}
LogCat output shows that the getTargetFragment is not set:
DatePickerFragment/sendResult: getTargetFragment = null
DatePickerFragment/sendResult: getTargetFragment actual value: null
So, I tried setting the setting the calling frament in DatePickerActivity as shown below, but this fails:
//return DatePickerFragment.newInstance(date);
DatePickerFragment fragment = DatePickerFragment
.newInstance(date);
fragment.setTargetFragment(CrimeFragment, REQUEST_DATE);
return fragment;
This results in an error: Error:(29, 36) error: cannot find symbol variable CrimeFragment
.
Any ideas as to why setTargetFragment isn't set?