Bienvenidos sean a este post, hoy veremos como agregar un cuadro de dialogo para poder seleccionar la hora en nuestra aplicacion, si no tienes esta aplicacion te recomiendo estos posts donde estan todos los pasos necesarios para poder crearlo:
- Mis Lugares y Marshmallow
- Agregando un fragmento a mis lugares
- otro fragmento a Mis Lugares
- Modificar el contenido de un fragmento desde otro
- Siguiendo con los fragments en Mis Lugares
- Ultimas tareas sobre Mis Lugares
Una vez creado o si ya lo tienen creado vayan al layout llamado vista_lugar.xml donde modificaremos el siguiente bloque:
<ImageView
android:src="@android:drawable/ic_menu_recent_history"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
De la siguiente forma:
<ImageView
android:id="@+id/icono_hora"
android:layout_width="40dp"
android:layout_height="40dp"
android:contentDescription="Logo Hora"
android:src="@android:drawable/ic_menu_recent_history" />
Este layout modifica levemente el icono de muestra de la hora que fue ingresado, en este caso modificamos el tamaño, le agregamos el id y una descripcion, nuestro siguiente paso sera modificar la clase VistaLugarFragment, en el metodo onCreateView() agregaremos el siguiente bloque antes de la linea return vista:
ImageView iconoHora = (ImageView) vista.findViewById(R.id.icono_hora);
iconoHora.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
cambiarHora();
}
});
En este caso primero crearemos un vinculo entre el codigo Java y el elemento del layout para luego crearle un escuchador a dicho vinculo para el evento click, es decir cada vez que presionemos sobre el mismo, por lo cual al ejecutarse llamara al metodo cambiarHora(), veamos el codigo de este metodo:
public void cambiarHora(){
DialogoSelectorHora dialogoHora = new DialogoSelectorHora();
dialogoHora.setOnTimeSetListener(this);
Bundle args = new Bundle();
args.putLong("fecha",lugar.getFecha());
dialogoHora.setArguments(args);
dialogoHora.show(getActivity().getSupportFragmentManager(),"selectorHora");
}
Este metodo debemos agregarlo dentro de la clase como un metodo mas, primero crearemos un objeto de tipo DialogoSelectorHora, ya crearemos esta clase no se preocupen por el error, llamada dialogoHora para luego setear el escuchador setOnTimeListener 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 hora almacenado para el lugar seleccionado y por ultimo asignaremos ese valor por medio de setArguments al objeto dialogoHora, nuestro siguiente paso sera agregar la clase antes mencionada este es el codigo:
public static class DialogoSelectorHora extends DialogFragment{
private TimePickerDialog.OnTimeSetListener escuchador;
public void setOnTimeSetListener(TimePickerDialog.OnTimeSetListener 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 hora = calendario.get(Calendar.HOUR_OF_DAY);
int minuto = calendario.get(Calendar.MINUTE);
return new TimePickerDialog(getActivity(), escuchador, hora,
minuto, DateFormat.is24HourFormat(getActivity()));
}
}
Este debemos agregarlo dentro de la clase, en este caso extendera a DialogFragment, primero crearemos un objeto llamado escuchador de tipo TimePickerDialog.OnTimeSetListener, luego tendremos el metodo setOnTimeListener 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 dos variables llamadas hora y minuto donde le asignaremos las constantes HOUR_OF_DAY y MINUTE respectivamente, por ultimo devolveremos el cuadro para seleccionar la fecha (TimePickerDialog) al cual le informaremos la actividad de contexto (getActivity), el escuchador, la hora, los minutos y por ultimo verificaremos si el formato es de 24 horas.
Nota: Puede que el metodo is24HourFormat no sea reconocido, para ello deben cambiar el paquete java.text.DateFormat a android.text.format.DateFormat.
Para nuestro siguiente paso debemos modificar el encabezado de la clase:
public class VistaLugarFragment extends Fragment {
De la siguiente forma:
public class VistaLugarFragment extends Fragment
implements TimePickerDialog.OnTimeSetListener {
Para poder implementar esta modificacion debemos agregar el siguiente metodo de lo contrario no funcionara:
@Override
public void onTimeSet(TimePicker vista, int hora, int minuto){
Calendar calendario = Calendar.getInstance();
calendario.setTimeInMillis(lugar.getFecha());
calendario.set(Calendar.HOUR_OF_DAY, hora);
calendario.set(Calendar.MINUTE, minuto);
lugar.setFecha(calendario.getTimeInMillis());
Lugares.actualizarLugar((int) id, lugar);
TextView tHora = (TextView) getView().findViewById(R.id.hora);
SimpleDateFormat formato = new SimpleDateFormat("HH:mm",
java.util.Locale.getDefault());
tHora.setText(formato.format(new Date(lugar.getFecha())));
}
Con este metodo estableceremos la hora, en este caso crearemos un objeto llamado calendario de tipo Calendar, luego setearemos por medio de setTimeInMillis la hora hora del lugar en calendario, despues por medio de HOUR_OF_DAY y MINUTE le estableceremos la hora y minuto respectivamente, nuestro siguiente paso sera establecer 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 setearlo en formato horas y minutos, para luego asignar dicho valor en el elemento del layout gracias al vinculo antes creado, antes de finalizar debemos modificar estas dos lineas:
fecha.setText(DateFormat.getDateInstance().format(
new Date(lugar.getFecha())));
hora.setText(DateFormat.getTimeInstance().format(
new Date(lugar.getFecha())));
De la siguiente forma:
fecha.setText(java.text.DateFormat.getDateInstance().format(
new Date(lugar.getFecha())));
hora.setText(java.text.DateFormat.getTimeInstance().format(
new Date(lugar.getFecha())));
Esto es debido a que modificamos el paquete que importamos de DateFormat, para implementar a is24HourFormat, y esto implica que no funcione esta parte del programa por ello debemos indicarle el nombre completo del paquete para encontrar el lugar correcto para este metodo, con esto modificado podemos probar nuestra aplicacion como se ve en el siguiente video
En el video anterior pudimos ver como se ve en el caso de una tablet ahora probemos lo mismo pero con un dispositivo movil
Como pueden ver se adapto correctamente al cambio de dispositivo y en ambos casos pudimos realizar los cambios, se modificaron en la base y se reflejaron automaticamente.
En resumen, hoy hemos visto como implementar un dialogo de hora para nuestra aplicacion Mis Lugares, como lograr de una manera mas eficiente establecer una hora, todos los pasos necesarios para su implementacion, 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.50