¿Cómo transferir la cadena de fecha formateada de mi DatePickerFragment?

Siguiendo el documento oficial http://developer.android.com/guide/topics/ui/controls/pickers.html#DatePicker .

He utilizado el mismo código y solo he agregado el formato de resultado en el método onDateSet :

 public class DatePickerFragment extends DialogFragment implements DatePickerDialog.OnDateSetListener { @Override public Dialog onCreateDialog(Bundle savedInstanceState) { // Use the current date as the default date in the picker final Calendar c = Calendar.getInstance(); int year = c.get(Calendar.YEAR); int month = c.get(Calendar.MONTH); int day = c.get(Calendar.DAY_OF_MONTH); // Create a new instance of DatePickerDialog and return it return new DatePickerDialog(getActivity(), this, year, month, day); } @Override public void onDateSet(DatePicker view, int year, int month, int day) { Calendar c = Calendar.getInstance(); c.set(year, month, day); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); String formattedDate = sdf.format(c.getTime()); // How to get the string from here to the caller? } } 

Para las pruebas, la actividad de la persona que llama solo muestra TextView y llama al selector cuando el usuario toca el widget:

 public class OrderHeadEditActivity extends Activity { private TextView mDTDelivery; ... @Override protected void onCreate(Bundle bundle) { ... mDTDelivery = (TextView) findViewById(R.id.order_head_view_dt_delivery); ... mDTDelivery.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { DialogFragment picker = new DatePickerFragment(); picker.show(getFragmentManager(), "datePicker"); } }); } ... } 

Se muestra el selector de fecha y, después de configurar el punto de interrupción en el lugar donde se formateó el resultado en una cadena, puedo ver que funciona.

Sin embargo, no sé cómo volver a pasar el valor de cadena al widget mtDTDelivery ?

Como señaló tyczj, puede usar el método de interfaz o puede hacer que la clase de datapicker sea una clase interna de su clase de actividad, en cuyo caso debe ser estática y necesita una referencia débil de la clase externa.

Usando la interfaz.

Defina una interfaz en DatePickerFragment . Implemente la interfaz en su clase de actividad y establezca la fecha en la vista de texto.

 public class DatePickerFragment extends DialogFragment implements DatePickerDialog.OnDateSetListener { TheListener listener; public interface TheListener{ public void returnDate(String date); } @Override public Dialog onCreateDialog(Bundle savedInstanceState) { // Use the current date as the default date in the picker final Calendar c = Calendar.getInstance(); int year = c.get(Calendar.YEAR); int month = c.get(Calendar.MONTH); int day = c.get(Calendar.DAY_OF_MONTH); listener = (TheListener) getActivity(); // Create a new instance of DatePickerDialog and return it return new DatePickerDialog(getActivity(), this, year, month, day); } @Override public void onDateSet(DatePicker view, int year, int month, int day) { Calendar c = Calendar.getInstance(); c.set(year, month, day); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); String formattedDate = sdf.format(c.getTime()); if (listener != null) { listener.returnDate(formattedDate); } } } 

Actividad principal

 public class MainActivity extends Activity implements DatePickerFragment.TheListener{ Button b; TextView tv; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); b= (Button) findViewById(R.id.button1); tv= (TextView) findViewById(R.id.textView1); b.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { // TODO Auto-generated method stub DialogFragment picker = new DatePickerFragment(); picker.show(getFragmentManager(), "datePicker"); } }); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; } @Override public void returnDate(String date) { // TODO Auto-generated method stub tv.setText(date); } } 

Segunda forma, no estoy seguro si esta es la mejor manera. Yo recomendaría el método de interfaz anterior.

 public class MainActivity extends Activity {//implements DatePickerFragment.TheListener{ Button b; TextView tv; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); b= (Button) findViewById(R.id.button1); tv= (TextView) findViewById(R.id.textView1); b.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { // TODO Auto-generated method stub DialogFragment picker = new DatePickerFragment(); picker.show(getFragmentManager(), "datePicker"); } }); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; } public static class DatePickerFragment extends DialogFragment implements DatePickerDialog.OnDateSetListener { private WeakReference mActivity; @Override public Dialog onCreateDialog(Bundle savedInstanceState) { // Use the current date as the default date in the picker final Calendar c = Calendar.getInstance(); int year = c.get(Calendar.YEAR); int month = c.get(Calendar.MONTH); int day = c.get(Calendar.DAY_OF_MONTH); mActivity = new WeakReference((MainActivity) getActivity()); // Create a new instance of DatePickerDialog and return it return new DatePickerDialog(getActivity(), this, year, month, day); } @Override public void onDateSet(DatePicker view, int year, int month, int day) { Calendar c = Calendar.getInstance(); c.set(year, month, day); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); String formattedDate = sdf.format(c.getTime()); MainActivity target = mActivity.get(); if (target != null) target.tv.setText(formattedDate); } } } 

La forma correcta es crear una callback a la actividad que pasa la cadena.

eche un vistazo a Comunicarse con una actividad