2012-08-01 5 views
14

ich nach dem Tutorial hier: http://developer.android.com/guide/topics/ui/controls/pickers.htmlAndroid Datepicker Fragment - Wie etwas zu tun, wenn der Benutzer ein Datum setzt?

bekam ich die Dinge zu arbeiten und die Datumsauswahl erscheint. Ich merke jedoch, wie ich vorgehen soll, wenn der Benutzer das Datum einstellt.

Ich sehe sie haben diese Methode:

public void onDateSet(DatePicker view, int year, int month, int day) { 
    // Do something with the date chosen by the user 
} 

Aber das tut nichts, wenn ich in ihm einen Code setzen.

Ich bin nicht so vertraut mit Java, also bin ich nicht sicher, welcher zusätzliche Code benötigt wird, um eine Textansicht mit dem gewählten Datum zu aktualisieren.

habe ich diesen Code hinzu:

private DatePickerDialog.OnDateSetListener mDateListener = 
     new DatePickerDialog.OnDateSetListener() { 
      public void onDateSet(DatePicker view, int year, int month, int day) { 
       updateDate(year, month, day); 
      } 
     }; 

public void updateDate(int year, int month, int day) { 
    TextView bdate = (TextView)findViewById(R.id.birthDate); 
    Date chosenDate = new Date(year, month, day); 
    java.text.DateFormat dateFormat = DateFormat.getDateFormat(getApplicationContext()); 
    bdate.setText(dateFormat.format(chosenDate)); 
} 

Aber das tut nichts.

ich dies fast genau Frage gefunden haben: Get date from datepicker using dialogfragment

jedoch in dieser Lösung würde nicht mit (EditSessionActivity) der DatePickerFragment Klasse begrenzt nur mit dem EditSessionActivity zu arbeiten?

Antwort

9

Sie sollten eine statische Factory verwenden, um Argumente an DialogFragment zu übergeben. Von der docs,

"Jedes Fragment muss einen leeren Konstruktor haben, so dass es bei der Wiederherstellung seiner Aktivität instanziiert werden kann. Es wird dringend empfohlen, dass Unterklassen keine anderen Konstruktoren mit Parametern haben, da diese Konstruktoren nicht aufgerufen werden Das Fragment wird erneut instantiiert; stattdessen können Argumente vom Aufrufer mit setArguments (Bundle) bereitgestellt und später vom Fragment mit getArguments() abgerufen werden. "

In ähnlicher Weise sollte die Fragment-Unterklasse statisch sein, damit sie sich selbst instanziieren kann, ohne sich auf die Elternaktivität oder das Fragment zu verlassen. Wenn du dich nicht an diese Richtlinien hältst, wirst du manchmal Abstürze oder Fehler bekommen, wenn dein Fragment versucht, fortzufahren.

Die empfohlene Methode zum Erstellen eines DialogFragments aus Android docs besteht darin, eine statische Factory-Methode zu verwenden. Hier ist ein Beispiel eines Datumsauswahl-Fragment, das in einem Anfangsdatum und ein OnDateChangedListener nimmt:

public static class DatePickerFragment extends DialogFragment{ 

    private OnDateSetListener onDateSetListener; 

    static DatePickerFragment newInstance(Date date, OnDateSetListener onDateSetListener) { 
     DatePickerFragment pickerFragment = new DatePickerFragment(); 
     pickerFragment.setOnDateSetListener(onDateSetListener); 

     //Pass the date in a bundle. 
     Bundle bundle = new Bundle(); 
     bundle.putSerializable(MOVE_IN_DATE_KEY, date); 
     pickerFragment.setArguments(bundle); 
     return pickerFragment; 
    } 

    @Override 
    public Dialog onCreateDialog(Bundle savedInstanceState) { 
     super.onCreateDialog(savedInstanceState); 

     Date initialDate = (Date) getArguments().getSerializable(MOVE_IN_DATE_KEY); 
     int[] yearMonthDay = ymdTripleFor(initialDate); 
     DatePickerDialog dialog = new DatePickerDialog(getActivity(), onDateSetListener, yearMonthDay[0], yearMonthDay[1], 
       yearMonthDay[2]); 
     return dialog; 
    } 

    private void setOnDateSetListener(OnDateSetListener listener) { 
     this.onDateSetListener = listener; 
    } 

    private int[] ymdTripleFor(Date date) { 
     Calendar cal = Calendar.getInstance(Locale.US); 
     cal.setTime(date); 
     return new int[]{cal.get(Calendar.YEAR), cal.get(Calendar.MONTH), cal.get(Calendar.DAY_OF_MONTH)}; 
    } 
} 

Sie dann eines dieser Dialogfragmente erstellen können wie folgt:

DatePickerFragment.newInstance(yourDate, yourOnDateSetListener); 
+1

Vielleicht sollten Sie hinzufügen, dass der Dialog erscheint, wenn Sie zuerst das Fragment instanziiert und seine dann verwenden ‚show () 'Methode, um es auf dem Bildschirm erscheinen zu lassen. –

2

Ich glaube, man die verwenden können DialogFragments hier:

DialogFragment newFragment = new DatePickerFragment(); 
newFragment.show(getSupportFragmentManager(), "datePicker"); 

die DatePickerFragment definieren und das Verfahren unter

implementieren
public void onDateSet(DatePicker view, int year, int month, int day) { 
// Do something with the date chosen by the user 
DateEdit.setText(day + "/" + (month + 1) + "/" + year); 
} 

entnommen von Android DialogFragment Example.

1

nach meiner Erfahrung funktioniert dieser Code perfekt !, Ich benutze win10 Android Studio 2.2 ...

import android.app.Dialog; 
import android.support.v4.app.DialogFragment; 
import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.view.View; 
import android.app.DatePickerDialog; 
import android.widget.DatePicker; 
import android.widget.EditText; 
import java.util.Calendar; 


public class MainActivity extends AppCompatActivity implements DatePickerDialog.OnDateSetListener{ 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main);} 

    public void datePicker(View view){ 
     DatePickerFragment fragment_date = new DatePickerFragment(); 
     fragment_date.show(getSupportFragmentManager(),"datePicker");} 

    @Override 
    public void onDateSet(DatePicker view, int year, int month, int day) { 
     String day_x = ""+ day ,month_x = ""+(month+1); 
     if (day < 9){ day_x = "0" + day_x;} 
     if (month < 9){ month_x = "0" + month_x;} 
     ((EditText) findViewById(R.id.txtDate)).setText(day_x + "/" + month_x + "/" + year);} 

    public static class DatePickerFragment extends DialogFragment { 
     @Override 
     public Dialog onCreateDialog (Bundle savedInstanceState){ 
      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); 
      return new DatePickerDialog(getActivity() ,(DatePickerDialog.OnDateSetListener)this,day,month,year);}} 

} 

Ich habe eine „Textview TxtDate“ und einen „Knopf mit Onclick = Datepicker“