Bienvenidos sean a este post, hoy continuaremos con lo iniciado en el post anterior donde creamos un cuadro de dialogo para agregar una hora y en el caso de hoy haremos algo similar pero para la fecha de los lugares, primero modificaremos vista_lugar.xml el icono que usamos para mostrar la fecha, modificaremos el siguiente codigo:

Anuncios
            <ImageView
                android:src="@android:drawable/ic_menu_my_calendar"
                android:layout_width="match_parent"
                android:layout_height="wrap_content" />

De la siguiente forma:

            <ImageView
                android:id="@+id/icono_fecha"
                android:layout_width="40dp"
                android:layout_height="40dp"
                android:contentDescription="Logo Fecha"
                android:src="@android:drawable/ic_menu_my_calendar" />

Nuestra primera modificacion sera cambiar el encabezado de la clase:

public class VistaLugarFragment extends Fragment
        implements TimePickerDialog.OnTimeSetListener {

De la siguiente forma:

public class VistaLugarFragment extends Fragment
        implements TimePickerDialog.OnTimeSetListener, 
        DatePickerDialog.OnDateSetListener {

Al igual que en el post anterior debemos agregar el siguiente bloque dentro del metodo onCreateView() antes de la linea return vista:

        ImageView iconoFecha = (ImageView) vista.findViewById(R.id.icono_fecha);
        iconoFecha.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                cambiarFecha();
            }
        });

Primero crearemos el vinculo entre el codigo Java y nuestro elemento del layout, a este objeto que contiene el vinculo la agregaremos un escuchador del evento click el cual al recibir este evento llamara al metodo cambiarFecha(), veamos a continuacion dicho metodo que debemos agregar dentro de la clase:

    public void cambiarFecha(){
        DialogoSelectorFecha dialogoFecha = new DialogoSelectorFecha();
        dialogoFecha.setOnDateListener(this);
        Bundle args = new Bundle();
        args.putLong("fecha",lugar.getFecha());
        dialogoFecha.setArguments(args);
        dialogoFecha.show(getActivity().getSupportFragmentManager(),"selectorFecha");
    }

Este metodo debemos agregarlo dentro de la clase como un metodo mas, primero crearemos un objeto de tipo DialogoSelectorFecha, ya crearemos esta clase no se preocupen por el error, llamada dialogoFecha para luego setear el escuchador setOnDateListener y el contexto por medio de this, despues crearemos un nuevo objeto llamado args de tipo Bundle, a este objeto por medio de putLong le asignaremos un valor identificado como fecha y por medio de getFecha() del objeto lugar le asignaremos el valor de la fecha almacenada para el lugar seleccionado y por ultimo asignaremos ese valor por medio de setArguments al objeto dialogoFecha, para nuestro siguiente paso implementaremos el siguiente metodo dentro de la clase:

    @Override
    public void onDateSet(DatePicker vista, int anyo, int mes, int dia){
        Calendar calendario = Calendar.getInstance();
        calendario.setTimeInMillis(lugar.getFecha());
        calendario.set(Calendar.YEAR, anyo);
        calendario.set(Calendar.MONTH, mes);
        calendario.set(Calendar.DAY_OF_MONTH, dia);
        lugar.setFecha(calendario.getTimeInMillis());
        Lugares.actualizarLugar((int) id, lugar);
        TextView tFecha = (TextView) getView().findViewById(R.id.fecha);
        java.text.DateFormat formato = java.text.DateFormat.getDateInstance();
        tFecha.setText(formato.format(new Date(lugar.getFecha())));
    }
Anuncios

Con este metodo estableceremos la fecha, en este caso crearemos un objeto llamado calendario de tipo Calendar, luego setearemos por medio de setTimeInMillis la fecha del lugar en calendario, despues por medio de YEAR, MONTH y DAY_OF_MONTH le estableceremos el año, el mes y el dia respectivamente, nuestro siguiente paso sera setear la fecha por medio de setFecha por medio de lugar, despues actualizaremos al lugar por medio de actualizarLugar de la clase Lugares, luego crearemos un vinculo entre el TextView del layout y nuestro codigo, despues crearemos un objeto de tipo SimpleDateFormat llamado formato que se encargara de establecer un formato para nuestra fecha en base a las configuraciones locales (Locale), para luego setear dicho valor en el elemento del layout gracias al vinculo antes creado, por ultimo agregaremos a nuestra clase la clase DialogoSelectorFecha:

    public static class DialogoSelectorFecha extends DialogFragment{

        private DatePickerDialog.OnDateSetListener escuchador;

        public void setOnDateListener(DatePickerDialog.OnDateSetListener escuchador){
            this.escuchador = escuchador;
        }

        @Override
        public Dialog onCreateDialog(Bundle savedInstanceState){
            Calendar calendario = Calendar.getInstance();
            Bundle args = this.getArguments();
            if (args!=null){
                long fecha = args.getLong("fecha");
                calendario.setTimeInMillis(fecha);
            }
            int anyo = calendario.get(Calendar.YEAR);
            int mes = calendario.get(Calendar.MONTH);
            int dia = calendario.get(Calendar.DAY_OF_MONTH);
            return new DatePickerDialog(getActivity(), escuchador, anyo, mes, dia);
        }
    }

Este debemos agregarlo dentro de la clase, en este caso extendera a DialogFragment, primero crearemos un objeto llamado escuchador de tipo DatePickerDialog.OnDateSetListener, luego tendremos el metodo setOnDateListener que se encargara de asignar el contexto (o escuchador) informado como argumento al escuchador de la clase, nuestro siguiente metodo es onCreateDialog, en este caso crearemos un objeto de tipo Calendar llamado calendario, nuestro siguiente objeto sera de tipo Bundle llamado args al cual le asignaremos un valor por medio de getArguments(), nuestro siguiente paso sera con un condicional donde si args es distinto de null (es decir tiene un valor asignado), crearemos una variable llamada fecha de tipo long y por medio de getLong extraeremos el valor asociado a args identificado como fecha, por ultimo se lo asignaremos a calendario por medio de setTimeInMillis(), luego crearemos tres variables llamadas anyo, mes y dia donde le asignaremos las constantes YEAR, MONTH y DAY_OF_MONTH respectivamente, por ultimo devolveremos el cuadro para seleccionar la fecha (DatePickerDialog) al cual le informaremos la actividad de contexto (getActivity), el escuchador, el anyo, el mes y el dia.

Con todas estas modificaciones realizadas podemos finalmente probar nuestra aplicacion, veamos el siguiente video

En este caso lo probamos con respecto a una tablet donde vemos como al modificar la fecha esta se modifico correctamente en tiempo real, veamos el siguiente video

En este caso vemos exactamente lo mismo pero implementado en un dispositivo movil.

Anuncios

En resumen, hoy hemos visto como implementar un cuadro de dialogo para la fecha, para que sirve, como implementarlo y todos los cambios necesarios para ser utilizado correctamente, espero les haya sido util sigueme en Twitter o Facebook para recibir una notificacion cada vez que subo un nuevo post en este blog, nos vemos en el proximo post.

Tambien podes donar

Es para mantenimiento del sitio, gracias!

$1.00