Estoy tratando de crear una aplicación donde el usuario selecciona una fecha en un selector de fecha y, a continuación, se actualiza una lista con algunos valores.

Mi GUI se parece a esto:

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

Mientras que mi DatePicker de inicialización y manejo como sigue:

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

    }
};

En CatLog veo que «la PRUEBA de la» cadena de producción dos veces, cada vez que juego con los botones +/- en el widget. ¿Cuál podría ser el problema?

Nota: he «movilidad» de la lista-la actualización del código de propósito, con el fin de asegurarse de que el problema no está relacionado con el ListView, como en aquí

  • última captura bro @tomor
InformationsquelleAutor tomor | 2012-09-15

8 Comentarios

  1. 139

    Cuando puedo probar mi aplicación, método de onDateSet llama dos veces después de aceptar la fecha de selección y una vez cuando he cancelado.

    He añadido una validación en el método onDateSet con el parámetro de vista, algo como esto

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

    Espero te sirva

    • Respuesta Simple y es un trabajo!
    • sí que funciona, pero su solución, no la solución adecuada…
    • lo que está mal con mi respuesta?
    • su respuesta es perfecto…no es necesario crear más variable booleana para comprobar.
    • gracias, funcionó……..
    • su trabajo bien!!
    • Simple y la respuesta perfecta !
    • eso es un hack; salvó mi día; cooooool
    • Muchas gracias! Me estaba volviendo loca.
    • La verdadera pregunta es: ¿por qué en la tierra se llama dos veces, de todos modos?
    • Es un bug que se ha solucionado en Android 5.0, no hay backport para la versión anterior. Para utilizar esta solución. Error: code.google.com/p/android/issues/detail?id=34833
    • Si usamos el código de arriba, ¿hay algún problema por encima de android 5.0 dispositivos?

  2. 9

    Todavía no he conseguido encontrar una buena revisión. Llevo bastante encontrado una solución, por lo que el caso no se dispara dos veces. La solución es la siguiente:

    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");
         }
    
    }};
    • Dude usted debe aceptar @Cesardl respuesta y mostrar algo de deportividad como esta respuesta es sólo una obra de alrededor.
  3. 2

    Lugar de la onDateSet de devolución de llamada que he reemplazado método onClick de la DatePickerDialog de diálogo y manejar BUTTON_POSITIVE clics solamente.

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

    El código queda claro, pero todavía no está claro por qué onDateSet es llamado dos veces.

  4. 0
    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(" "));
        }
    • Gracias por tu respuesta, pero esto no parece resolver mi problema. Yo no estoy teniendo problemas con la actualización de la pantalla. Más bien, estoy teniendo la pantalla se actualiza dos veces, en lugar de una vez.
    • Intenta esto… DatePickerDialog.OnDateSetListener mDateSetListener = new DatePickerDialog.OnDateSetListener() { public void onDateSet(
    • El problema es que el selector de fecha.init acepta como último parámetro de un selector de fecha.OnDateChangedListener, no DatePickerDialog.OnDateSetListener, por lo que no está funcionando :S
    • Me vino a averiguar que el problema no estaba relacionado con la actualización de la vista, pero fue algo que ver con que el diálogo está siendo creado, así que si es para controlar el efecto, a continuación, la solución se encuentra en el control de la creación de diálogo y visibilidad dependiendo del método que usted utilice para rellenar el cuadro de diálogo
  5. 0

    Quizás modificar el oyente mediante la adición de las variables de instancia, de esa manera, usted puede comprobar para ver si son diferentes desde la última vez que el método se llama:

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

    No es necesario añadir este código en virtud de las habas de Jalea

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

Dejar respuesta

Please enter your comment!
Please enter your name here