2

Es gibt ein Problem mit DatePickerDialog und TimePickerDialog. Ein Benutzer kann mit den Plus- oder Minus-Tasten ein Datum und eine Uhrzeit auswählen. Das funktioniert. Aber wenn der Benutzer in das Feld klickt, kann er einen Wert von Tastatur gesetzt:Android: DatePickerDialog und TimePickerDialog übergeben keine Auswahl

picker dialog

Aber dies nicht bei allen. Wenn der Benutzer einen neuen Wert eingibt und auf die Schaltfläche "OK" klickt, wird der Wert des aktuell ausgewählten Felds nicht an die Methode onDateSet übergeben. Dies funktioniert weder in DatePickerDialog noch in TimePickerDialog. Stattdessen muss der Benutzer auf die grüne Schaltfläche auf der Tastatur klicken, um den Wert in DatePickerDialog wirklich festzulegen. Wenn er "OK" drückt, dann wird der Wert übergeben, aber das ist eine ziemlich idiotische Usability. Niemand würde das tun. Dies ist, wie ich die Fragmente implementieren:

public class DatePickerFragment extends DialogFragment implements DatePickerDialog.OnDateSetListener 
{ 
    private final DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd"); 

    @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) 
    { 
     final Calendar calendar = Calendar.getInstance(Locale.getDefault()); 
     calendar.set(year, month, day); 
     String pickedDate = dateFormat.format(calendar.getTime()); 

     ((MenuEditActivity)getActivity()).setMenuDate(pickedDate); 
    } 

    @Override 
    public void onCancel(DialogInterface dialog) 
    { 
     super.onCancel(dialog); 
    } 
} 

Hat jemand das gleiche Problem haben und bereits einige schnelle Abhilfe implementieren? (Ich möchte die ganzen Picker-Dialoge nicht einfach neu implementieren, nur von dieser halbfertigen Implementierung).

+0

Nun, ich beobachte nicht das Verhalten, das du beschreibst, aber wenn du den Fokussiertrick mit dem 'TimePickerDialog' ausprobieren willst, solltest du den' TimePicker' mit einer ähnlichen Methode wie in [ diese Antwort] (http://stackoverflow.com/a/39071972). Sie würden 'findViewById()' auf Ihrem 'TimePickerDialog' aufrufen, stattdessen' 'timePicker'' anstelle von '" ampm_layout "', und die zurückgegebene 'View' sollte der' TimePicker' sein. (Sie würden natürlich die Sichtbarkeitsdaten weglassen.) Sie müssen dies möglicherweise in der Methode 'onStart()' von 'Fragment' tun, um sicherzustellen, dass alles korrekt initialisiert wurde. –

+0

@MikeM. Danke, es funktioniert jetzt (siehe meine aktualisierte Frage). Wenn du es als Antwort postest, kann ich es akzeptieren. Übrigens, es ist komisch. Ich habe gestern schon etwas ähnliches versucht, aber ich bin immer null geworden. Vielleicht war es das, weil ich es nicht in 'onStart()' gemacht habe. – Bevor

+0

Kein Problem. Ja, ich hatte eine Chance, früher einen Schnelltest zu machen, und es spielte nicht gut in 'onCreateDialog()'. Ich habe den Grund nicht wirklich untersucht, aber es hat in 'onStart()' recht gut funktioniert. Anyhoo, deine ausgearbeiteten Lösungen sind viel besser als mein kleiner Vorschlag. Sie sollten diese Änderungen stattdessen auf eine Antwort übertragen. Trotzdem danke. Schätzen Sie das Angebot. Prost! –

Antwort

2

Ich habe eine Problemumgehung für DatePickerDialog gefunden, um die Tastatur zu deaktivieren, damit der Benutzer das Datum nicht per Tastatur eingeben kann. (Siehe auch [Disable keyboard input on Android TimePicker)

public class MyDatePickerDialog extends DatePickerDialog 
    { 
     public MyDatePickerDialog(Context context, OnDateSetListener listener, int year, int month, int dayOfMonth) 
     { 
      super(context, listener, year, month, dayOfMonth); 
     } 

     @NonNull 
     @Override 
     public DatePicker getDatePicker() 
     { 
      return super.getDatePicker(); 
     } 
    } 

in Fragmente ....

final MyDatePickerDialog datePickerDialog = new MyDatePickerDialog(getActivity(), this, year, month, day); 
datePickerDialog.getDatePicker().setDescendantFocusability(DatePicker.FOCUS_BLOCK_DESCENDANTS); 

Aber dies ist nicht möglich, mit TimePickerDialog, da es keine Methode ist, die TimePicker zu bekommen, so habe ich eine andere Abhilfe für Zeit Picker, dank Mike M.

public class TimePickerFragment extends DialogFragment implements TimePickerDialog.OnTimeSetListener 
{ 
    private TimePickerDialog timePickerDialog; 

    @Override 
    public Dialog onCreateDialog(Bundle savedInstanceState) 
    { 
     //Default 6:00 
     timePickerDialog = new TimePickerDialog(getActivity(), this, 6, 0, android.text.format.DateFormat.is24HourFormat(getActivity())); 

     return timePickerDialog; 
    } 

    @Override 
    public void onStart() 
    { 
     super.onStart(); 

     final View hourView = timePickerDialog.findViewById(Resources.getSystem().getIdentifier("hour", "id", "android")); 
     final View minuteView = timePickerDialog.findViewById(Resources.getSystem().getIdentifier("minute", "id", "android")); 

     if (hourView != null && hourView instanceof NumberPicker) 
     { 
      ((NumberPicker) hourView).setDescendantFocusability(TimePicker.FOCUS_BLOCK_DESCENDANTS); 
     } 

     if (minuteView != null && minuteView instanceof NumberPicker) 
     { 
      ((NumberPicker) minuteView).setDescendantFocusability(TimePicker.FOCUS_BLOCK_DESCENDANTS); 
     } 
    } 

    @Override 
    public void onTimeSet(TimePicker view, int hourOfDay, int minute) 
    { 
     ((MenuEditActivity) getActivity()).setRecipeTime(hourOfDay, minute); 
    } 

    @Override 
    public void onCancel(DialogInterface dialog) 
    { 
     super.onCancel(dialog); 
    } 
} 
+0

Schön und gründlich. Vergiss nicht, dies zu akzeptieren, wenn du kannst. Prost! –

+0

@MikeM. SO zwingt mich, einen Tag zu warten, bis ich es akzeptieren kann. – Bevor

+0

Ja, ich wusste, dass es ein oder zwei Tage war. War aber nicht sicher. –

0

Das ist für mich gearbeitet:

@SuppressWarnings("deprecation") 
@Override 
public void onTimeSet(TimePicker timePicker, int selectedHour, int selectedMinute) { 
    timePicker.requestFocus(); 
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { 
     hour = timePicker.getHour(); 
     minute = timePicker.getMinute(); 
    } else { 
     hour = timePicker.getCurrentHour(); 
     minute = timePicker.getCurrentMinute(); 
    } 
} 
Verwandte Themen