2013-08-13 8 views
8

Nach dem offiziellen Dokument http://developer.android.com/guide/topics/ui/controls/pickers.html#DatePicker.Wie übertrage ich die formatierte Datumszeichenkette von meinem DatePickerFragment?

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? 

    } 
} 

Zum Testen der Anrufer Aktivität nur zeigt die TextView und ruft den Picker, wenn der Benutzer berührt das Widget:

Ich habe gerade den gleichen Code, und fügte hinzu, nur das Ergebnis der Formatierung in der onDateSet Methode :

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"); 
      } 
     }); 
    } 
... 
} 

die Datumsauswahl angezeigt wird, und nach dem Haltepunkt an der Stelle einstellen, wo das Ergebnis in einen String formatiert ist, kann ich sehen, es funktioniert.

Ich weiß jedoch nicht, wie Sie den String-Wert zurück an das Widget mtDTDelivery übergeben?

+0

machen Sie Ihre Datapicker-Klasse eine innere Klasse Ihrer Aktivitätsklasse – Raghunandan

+0

haben Sie versucht, die unten? Die Schnittstellenmethode wird funktionieren. – Raghunandan

+0

Ich habe es noch nicht versucht. Ich werde es später versuchen. Ich würde es gerne zuerst verstehen. (Ich bin neu in Java und seine Iterfaces, und auch neu für Android.) – pepr

Antwort

14

Als tyczj Sie die Interface-Methode verwenden, wies darauf hin, oder man konnte Datapicker-Klasse ist eine innere Klasse Ihrer Aktivitätsklasse in diesem Fall ist es statisch und Sie müssen sein sollte, eine WeakReference des Fabrikats Außenklasse

Verwendung der Schnittstelle.

Definieren Sie eine Schnittstelle in DatePickerFragment. Implementieren Sie die Schnittstelle in Ihrer Aktivitätsklasse und legen Sie das Datum auf textview fest.

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

} 

} 
} 

MainActivity

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); 
    } 

} 

Zweiter Weg nicht sicher, ob dies der beste Weg ist. Ich würde die obige Schnittstellenmethode empfehlen.

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<MainActivity> 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>((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); 

    } 
    } 
} 
+1

Ich muss es ein bisschen mehr studieren. Wie auch immer, wie es passiert, bekommt der 'listener' in' DatePickerFragment' seinen Nicht-Null-Wert? – pepr

+0

Sie definieren eine Schnittstelle in 'DatePickerFragment'. Implementieren Sie dann die Schnittstelle in Ihrer Aktivitätsklasse. Sie legen den Wert für die Schnittstellenmethode fest. Da Ihre Aktivitätsklasse die Schnittstelle implementiert, erhalten Sie dort den Wert. Überprüfen Sie das Thema ** Erstellen von Ereignisrückrufen für die Aktivität ** http://developer.android.com/guide/components/fragments.html#CommunicatingWithActivity – Raghunandan

+0

@pepr über die Schnittstelle zu wissen. http://docs.oracle.com/javase/tutorial/java/concepts/interface.html – Raghunandan

4

Die richtige Methode besteht darin, einen Rückruf für die Aktivität zu erstellen, die die Zeichenfolge übergibt.

einen Blick auf Communicating with an Activity

+0

+1 Danke für den Link. – pepr

+0

Genau das, was ich gesucht habe. Vielen Dank! – ChrisG

Verwandte Themen