I am having trouble passing the data (the user selected date from the Date Widget) from the widget back to the calling fragment and set it on the Button. The starting fragment successfully passes the current date to the widget but having troubles passing the user selected date back to the calling fragment.
Here is the code for Starting fragment i.e. CrimeFragment
package com.khalsa.gurankassingh.criminalintent; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.support.annotation.Nullable; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentManager; import android.text.Editable; import android.text.TextWatcher; import android.text.format.DateFormat; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.Button; import android.widget.CheckBox; import android.widget.CompoundButton; import android.widget.EditText; import java.util.Date; import java.util.UUID; /** * Created by Gurankas Singh on 3/12/2017. */ public class CrimeFragment extends Fragment { public static final String ARG_CRIME_ID = "crime_id"; public static final String DIALOG_DATE = "DialogDate"; private static final int REQUEST_DATE = 0; private Crime mCrime; //instance of the Crime class private EditText mTitleField; // The editable text field in the fragment private Button mDateButton; //Displays the date of the crime on the button private CheckBox mSolvedCheckBox; //Displays the current status of the crime; solved or unsolved public static CrimeFragment newInstance(UUID crimeID) //to pass value to the fragment via an argument to another fragment { Bundle args = new Bundle(); args.putSerializable(ARG_CRIME_ID,crimeID); CrimeFragment fragment = new CrimeFragment(); fragment.setArguments(args); return fragment; } @Override public void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); UUID crimeId = (UUID)getArguments().getSerializable(ARG_CRIME_ID); mCrime = CrimeLab.get(getActivity()).getCrime(crimeId); } @Nullable @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { View v = inflater.inflate(R.layout.fragment_crime,container,false); mTitleField = (EditText) v.findViewById(R.id.crime_title); mTitleField.setText(mCrime.getTitle()); mTitleField.addTextChangedListener(new TextWatcher() { @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { } @Override public void onTextChanged(CharSequence s, int start, int before, int count) { mCrime.setTitle(s.toString()); } @Override public void afterTextChanged(Editable s) { } }); mDateButton = (Button) v.findViewById(R.id.crime_date); updateDate(); mDateButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { FragmentManager fragmentManager = getFragmentManager(); DatePickerFragment dialog = DatePickerFragment.newInstance(mCrime.getDate()); setTargetFragment(CrimeFragment.this,REQUEST_DATE); dialog.show(fragmentManager, DIALOG_DATE); } }); mSolvedCheckBox = (CheckBox) v.findViewById(R.id.crime_solved); mSolvedCheckBox.setChecked(mCrime.isSolved()); mSolvedCheckBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { //set the crime's solved property mCrime.setSolved(isChecked); } }); return v; } @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { if (resultCode != Activity.RESULT_OK) { return; } if (requestCode == REQUEST_DATE) { Date date = (Date)data.getSerializableExtra(DatePickerFragment.EXTRA_DATE); mCrime.setDate(date); updateDate(); } } private void updateDate() { mDateButton.setText(DateFormat.format("EEEE, d MMMM, yyy", mCrime.getDate())); } } Here is the code for the datePicker widget hosted by DatePickerFragment
package com.khalsa.gurankassingh.criminalintent; import android.app.Activity; import android.app.Dialog; import android.content.DialogInterface; import android.content.Intent; import android.os.Bundle; import android.support.annotation.NonNull; import android.support.v4.app.DialogFragment; import android.support.v7.app.AlertDialog; import android.view.LayoutInflater; import android.view.View; import android.widget.DatePicker; import java.util.Calendar; import java.util.Date; import java.util.GregorianCalendar; /** * Created by Gurankas Singh on 4/9/2017. */ public class DatePickerFragment extends DialogFragment { private static final String DATE_ARG = "date"; public static final String EXTRA_DATE = "com.khalsa.gurankassingh.criminalintent.date"; private DatePicker mDatePicker; public static DatePickerFragment newInstance(Date date) { Bundle args = new Bundle(); args.putSerializable(DATE_ARG,date); DatePickerFragment fragment = new DatePickerFragment(); fragment.setArguments(args); return fragment; } @NonNull @Override public Dialog onCreateDialog(Bundle savedInstanceState) { Date date = (Date)getArguments().getSerializable(DATE_ARG); Calendar calendar = Calendar.getInstance(); calendar.setTime(date); int year = calendar.get(Calendar.YEAR); int month = calendar.get(Calendar.MONTH); int day = calendar.get(Calendar.DAY_OF_MONTH); View v = LayoutInflater.from(getActivity()).inflate(R.layout.dialog_date,null); mDatePicker = (DatePicker)v.findViewById(R.id.dialog_date_date_picker); mDatePicker.init(year,month,day,null); 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(); } 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); } }