2012-09-28 16 views
14

Ya he implementado este oyente para que pueda mostrar algo cuando se hace clic en una fecha determinada, pero el problema es que cuando desplazo el CalendarView hacia abajo, se muestra automáticamente algo pero no hice clic cualquier cosa, simplemente me desplacé al mes anterior en CalendarView y luego aparece un, digamos un Toast o un Log, lo que sea (supongo que tiene sentido ya que el oyente dispara `onDateChange y como el desplazamiento hacia abajo del calendario también cambia la fecha actualmente seleccionada) Así que mi pregunta es si hay algún oyente para CalendarView que pueda usar solo una alternativa para el oyente de ondateChange, para evitar la situación de que cuando me desplazo hacia abajo en la vista de calendario para ir a otro mes, automáticamente se activa el contenido.Android: CalendarView OnDateChangeLIstener

¿Alguien que conoce un listador alternativo de CalendarView o alguien sabe una solución alternativa? por favor, comparta

Respuesta

7

Acabo de tener el mismo problema y encontré una solución alternativa para ello.

crear la variable "Fecha larga" y cuando inicie la ventana de calendario guarde la fecha actual en esta variable.

Long date; 
cv = (CalendarView)findViewById(R.id.calendarView1); 
date = cv.getDate(); 

ahora en el oyente simplemente comprobar si la nueva fecha es el mismo que el calendario:

cv.setOnDateChangeListener(new OnDateChangeListener(){ 
     public void onSelectedDayChange(CalendarView view, int year, int month, int dayOfMonth) { 
      if(cv.getDate() != date){ 
       date = cv.getDate(); 
       Toast.makeText(view.getContext(), "Year=" + year + " Month=" + month + " Day=" + dayOfMonth, Toast.LENGTH_LONG).show(); 
      }    
     } 
    }); 

que trabajó para mí :)

+1

esto no ayuda 'setOnDateChangeListener' siempre devuelve la fecha seleccionada inicialmente por lo que el Toast nunca se mostrará. Corrígeme si estoy equivocado. –

+1

no está mal, esto es el trabajo en torno a la tostada ... Nunca será visto por desplazamiento, sólo para seleccionar fecha diferente ... – HFDO5

+0

@ HFDO5 - Sus obras lógicas de trabajo, pero ¿cómo seleccionar la fecha actual? – TheDevMan

0

Mi forma de evitar esto estaba usando el calendario de HoloEverywhere (código fuente disponible para personalización), comentando el código que hace que esto sea invocado e invocando en el método onDateTapped, que hace lo esperado. Y también funciona en dispositivos pre ICS.

-1

Tal vez mi solución a mi problema anterior le dará una idea. Cuando selecciono una fecha de la vista del calendario, se muestra un mapa de Google que muestra la ruta que caminé para esa fecha. Como la latitud y la longitud se recuperan de la base de datos, consulto la base de datos para esa fecha y, si no hay ningún registro, la aplicación muestra un mensaje de brindis. De lo contrario, muestra un mapa de google con la ruta.

8

Cuando se desplaza por el calendario onSelectedDayChange método se comporta como si hace clic en una fecha diferente pero que no cambiará la configuración de fecha actual. Así HFDO5 tenía razón, sólo tiene que salvar a fecha actual al crear su calendario: Long date = calendar.getDate();

y comprobar que en onSelectedDayChange.

if(callendar.getDate() != date){ 
date = calendar.getDate(); //new current date 
//date is changed on real click...do things.. 

} 
+0

He hecho esto en mi aplicación, pero cuando se desplaza el movimiento de calendario que no es lisa. ¿se puede agregar esto a la solución? –

2

Finalmente decidí que necesitaba para mostrar un botón "OK" por debajo de la CalendarView lo que la fecha puede ser elegido y el calendario despedidos.

Porque al hacer clic en la fecha actual no pasa nada, y cuando se desplaza recibe llamadas a su OnDateChangeListener.

Ejemplo de disposición de calendario con el fondo negro máscara puede hacer clic para despedir:

<LinearLayout 
    android:id="@+id/calendar_layout" 
    android:onClick="dismissCalendar" 
    android:visibility="gone" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical" 
    android:padding="20dp" 
    android:background="@color/black_mask"> 

    <CalendarView 
     android:id="@+id/calendar" 
     android:layout_width="match_parent" 
     android:layout_height="0dp" 
     android:layout_weight="1" 
     android:background="@color/white" 
     android:showWeekNumber="false" 
     android:firstDayOfWeek="2" 
     /> 

    <TextView 
     android:onClick="selectDate" 
     android:text="@string/select_date" 
     android:background="@color/colorPrimary" 
     style="@style/settings_button"/> 

</LinearLayout> 

Entonces código de ejemplo:

private void openCalendar(Date date) { 
    calendar.setDate(date.getTime()); 
    calendarLayout.setVisibility(View.VISIBLE); 
} 

public void selectDate(View view) { 
    Date date = new Date(calendar.getDate()); 
    // do whatever you need with date 
    dismissCalendar(view); 
} 

public void dismissCalendar(View view) { 
    calendarLayout.setVisibility(View.INVISIBLE); 
} 
Cuestiones relacionadas