DatePicker.OnDateChangedListener wurde zweimal aufgerufen

Ich versuche, eine App zu erstellen, in der der Benutzer ein Datum aus einem DatePicker auswählt und dann eine Liste mit einigen Werten aktualisiert wird.

Meine GUI sieht so aus:

  • Android - Overflow-Menü und Back-Button nicht in der Collapsing Toolbar angezeigt
  • Circular Progress mit einem schwimmenden Action-Button
  • Welche Maßeinheit macht Paint.setStrokeWidth ()?
  • Kitkat kills: Nicht erlaubt, lokale Ressource zu laden: file: ///android_asset/webkit/android-weberror.png
  • Wie finde ich die maximale Texturgröße für verschiedene Telefone?
  • Wie testen Sie eine Android-Anwendung über mehrere Aktivitäten hinweg?
  • <LinearLayout android:id="@+id/linearLayout1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" > <DatePicker android:id="@+id/datePicker" android:layout_width="wrap_content" android:layout_height="wrap_content" /> </LinearLayout> <LinearLayout android:id="@+id/linearLayout2" android:layout_width="match_parent" android:layout_height="wrap_content" > <ListView android:id="@+id/list" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_weight="1" > </ListView> </LinearLayout> 

    Während meine DatePicker-Initialisierung und Handhabung wie folgt aussehen:

     public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); datePicker = (DatePicker) findViewById(R.id.datePicker); Calendar c = Calendar.getInstance(); year = c.get(Calendar.YEAR); month = c.get(Calendar.MONTH); day = c.get(Calendar.DAY_OF_MONTH); datePicker.init(year, month, day, dateSetListener); } private DatePicker.OnDateChangedListener dateSetListener = new DatePicker.OnDateChangedListener() { public void onDateChanged(DatePicker view, int year, int monthOfYear, int dayOfMonth) { Calendar c = Calendar.getInstance(); c.set(year, monthOfYear, dayOfMonth); System.out.println ("TEST"); } }; 

    In CatLog sehe ich, dass "TEST" String zweimal ausgegeben wird, jedes Mal, wenn ich mit den +/- Tasten auf dem Widget spiele. Was könnte das Problem sein?

    Anmerkung: Ich habe den Listen-Aktualisierungscode absichtlich deaktiviert, um sicherzustellen, dass das Problem nicht mit dem ListView zusammenhängt, wie hier

  • Fehler beim Konvertieren von Java nach Kotlin. Fehler - org.gradle.api.tasks.TaskExecutionException: Ausführung fehlgeschlagen für Task ': app: compileDebugKotlin'
  • Setzen Sie die Benachrichtigung zu bestimmten Zeit android
  • Android Bewertung Bar zeigt nur volle Sterne, nicht halbe Sterne zu
  • Wie kann ich Dateien zwischen Android-Anwendungen auf demselben Gerät übertragen?
  • Android, schnellste Weg, um eine Bitmap auf Leinwand zu zeichnen
  • Standort der .apk-Datei
  • 9 Solutions collect form web for “DatePicker.OnDateChangedListener wurde zweimal aufgerufen”

    Wenn ich meine Anwendung tippe, rief die Methode onDateSet zweimal nach der Datumsauswahl und einmal, wenn ich abgesagt habe.

    Ich habe eine Validierung in der Methode onDateSet mit Parameteransicht hinzugefügt, so etwas

     @Override public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth){ if (view.isShown()) { updateDate(year, monthOfYear, dayOfMonth); } } 

    Ich hoffe du servierst

    Ich habe es noch nicht geschafft, eine ordentliche Lösung zu finden. Ich habe eher einen Workaround gefunden, so dass das Event nicht zweimal schießt. Der Workaround ist wie folgt:

     int timesCalled = 1; private DatePicker.OnDateChangedListener dateSetListener = new DatePicker.OnDateChangedListener() { public void onDateChanged(DatePicker view, int year, int monthOfYear, int dayOfMonth) { Calendar c = Calendar.getInstance(); c.set(year, monthOfYear, dayOfMonth); timesCalled += 1; if ((timesCalled % 2) == 0) { System.out.println ("TEST"); } }}; 

    Statt des onDateSet-Rückrufs habe ich die onClick-Methode des DatePickerDialog-Dialogs überschrieben und nur BUTTON_POSITIVE-Klicks behandelt.

     public static class DatePickerFragment extends DialogFragment { @Override public Dialog onCreateDialog(Bundle savedInstanceState) { final Calendar c = Calendar.getInstance(); int initialYear = c.get(Calendar.YEAR); int initialMonth = c.get(Calendar.MONTH); int initialDay = c.get(Calendar.DAY_OF_MONTH); return new DatePickerDialog(getActivity(), null, initialYear, initialMonth, initialDay) { @Override public void onClick(DialogInterface dialog, int which) { if (which == BUTTON_POSITIVE) { int year = getDatePicker().getYear(); int month = getDatePicker().getMonth(); int day = getDatePicker().getDayOfMonth(); //TODO: Do your logic here } super.onClick(dialog, which); } }; } } 

    Der Code bleibt klar, aber trotzdem ist es nicht klar, warum onDateSet zweimal aufgerufen wird.

     private DatePicker.OnDateChangedListener dateSetListener = new DatePicker.OnDateChangedListener() { public void onDateChanged(DatePicker view, int year, int monthOfYear, int dayOfMonth) { Calendar c = Calendar.getInstance(); c.set(year, monthOfYear, dayOfMonth); updateDisplay(); } }; TextView datetext; datetext = (TextView) findViewById(R.id.selected_date); private void updateDisplay() { this.datetext.setText(new StringBuilder() // Month is 0 based so add 1 .append(mMonth + 1).append("-").append(mDay).append("-") .append(mYear).append(" ")); } 

    Vielleicht modifizieren Sie den Zuhörer, indem Sie Instanzvariablen hinzufügen, so können Sie überprüfen, ob sie sich von dem letzten Mal unterscheiden, als die Methode aufgerufen wurde:

     final DatePickerDialog datePickerDialog = new DatePickerDialog (this, new DatePickerDialog.OnDateSetListener() { private int year; private int month; private int day; @Override public void onDateSet (DatePicker view, int year, int monthOfYear, int dayOfMonth) { if (this.year == year && this.month == monthOfYear && this.day == dayOfMonth) return; this.year = year; this.month = monthOfYear; this.day = dayOfMonth; calendar.set (year, month, day); int index = officeCalendar.indexOfKey (calendar.getTimeInMillis ()); if (index > -1) viewPager.setCurrentItem (index); } }, calendar.get (Calendar.YEAR), calendar.get (Calendar.MONTH), calendar.get (Calendar.DATE)); 
     private DatePicker.OnDateChangedListener dateSetListener = new DatePicker.OnDateChangedListener() { boolean fired = false; public void onDateChanged(DatePicker view, int year, int monthOfYear, int dayOfMonth) { if (fired == true){ //Twince } else{ Calendar c = Calendar.getInstance(); c.set(year, monthOfYear, dayOfMonth); System.out.println ("TEST"); } } }; 

    Bitte überprüfen Sie meine Antwort hier. Es ist für TimePickerDialog, aber auch für DatePickerDialog. Sie können einen benutzerdefinierten Dialog erstellen, es ist fast genauso schnell und einfach und funktioniert einfach.

    https://stackoverflow.com/a/25672760/940450

    Nicht notwendig, um diesen Code unter Jelly Beans hinzuzufügen

     @Override public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth){ if (view.isShown()) { updateDate(year, monthOfYear, dayOfMonth); } } 

    Habe das gleiche Problem nur in der 4.2 Version von Android, es funktioniert gut mit 2.2 (ruft das Datum Hörer nur einmal). Ich benutze einen datepicker in einem dialogfragment, mit einem Rückruf für die Aktivitäten. Um das Problem zu lösen, habe ich das gleiche Problem gehabt als du, also habe ich deine Antwort aufgehoben, da ich keine Erklärung dafür gefunden habe.

    Das Android ist ein Google Android Fan-Website, Alles ├╝ber Android Phones, Android Wear, Android Dev und Android Spiele Apps und so weiter.