Mis Lugares: Primeras actividades
En el apartado anterior creamos la aplicación Mis Lugares que permitirá a los usuarios almacenar información sobre los sitios que han visitado.
En este apartado crearemos un par de actividades para esta aplicación. La primera actividad contendrá simplemente cuatro botones. La segunda contendrá un formulario para dar de alta y editar un lugar. Esta primera versión de la aplicación no almacenará los datos introducidos.
Práctica: Creación de una primera actividad en Mis Lugares
En esta práctica crearemos una primera actividad que contendrá simplemente cuatro botones
1. Edita el fichero res > layout > content_main.xml y trata de crear una vista similar a la que ves a continuación. Has de dejar el NestedScrollView que ya tenías y reemplazar el TextView por un ConstraintLayout que contenga cuatro Button. Un NestedScrollView solo puede contener dentro un elemento, por lo que no puedes introducir directamente los cuatro botones.
Solución:
1. El fichero content_main.xml ha de ser similar al siguiente:
<androidx.core.widget.nestedscrollview
android:layout_height="match_parent"
android:layout_width="match_parent"
app:layout_behavior="@string/appbar_scrolling_view_behavior"
tools:context=".MainActivity"
tools:showin="@layout/activity_main"
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools">
<androidx.constraintlayout.widget.constraintlayout
android:gravity="center"
android:id="@+id/linearLayout"
android:layout_height="match_parent"
android:layout_width="match_parent"
android:padding="30dp">
<button
android:id="@+id/button01"
android:layout_height="wrap_content"
android:layout_width="0dp"
android:text="@string/accion_mostrar"
app:layout_constraintend_toendof="parent"
app:layout_constraintstart_tostartof="parent"
app:layout_constrainttop_totopof="parent">
</button>
<button
android:id="@+id/button02"
android:layout_height="wrap_content"
android:layout_width="0dp"
android:text="@string/accion_preferencias"
app:layout_constraintend_toendof="parent"
app:layout_constraintstart_tostartof="parent"
app:layout_constrainttop_tobottomof="@+id/button01">
</button>
<button
android:id="@+id/button03"
android:layout_height="wrap_content"
android:layout_width="0dp"
android:text="@string/accion_acerca_de"
app:layout_constraintend_toendof="parent"
app:layout_constraintstart_tostartof="parent"
app:layout_constrainttop_tobottomof="@+id/button02">
</button>
<button
android:id="@+id/button04"
android:layout_height="wrap_content"
android:layout_width="0dp"
android:text="@string/accion_salir"
app:layout_constraintend_toendof="parent"
app:layout_constraintstart_tostartof="parent"
app:layout_constrainttop_tobottomof="@+id/button03">
</button>
</androidx.constraintlayout.widget.constraintlayout>
</androidx.core.widget.nestedscrollview>
2. El fichero res > values > strings.xml ha de tener el siguiente contenido:
<resources>
<string name="accion_mostrar">Mostrar Lugares</string>
<string name="accion_preferencias">Preferencias</string>
<string name="accion_acerca_de">Acerca de </string>
<string name="accion_salir">Salir</string>
<string name="app_name">Mis Lugares</string>
...
</resources>
El objetivo de esta práctica es crear un layout que permita introducir y editar lugares en la aplicación Mis Lugares.
1. Crea un nuevo layout con nombre edicion_lugar.xml.
2. Ha de parecerse al siguiente formulario. Has de basarte en un ConstraintLayout para distribuir los elementos. Pero es importante que este layout, se encuentre dentro de un NestedScrollView
para que cuando el formulario no quepa en pantalla se pueda desplazar verticalmente.
3. Introduce a la derecha del TextView con texto “Tipo:” un Spinner con id tipo. Más adelante configuraremos esta vista para que muestre un desplegable con los tipos de lugares.
4. Las vistas EditText han de definir el atributo id con los valores: nombre, direccion, telefono, url y comentario. Utiliza también el atributo hint para dar indicaciones sobre el valor a introducir. Utiliza el atributo inputType para indicar qué tipo de entrada esperamos. De esta manera se mostrará un teclado adecuado (por ejemplo si introducimos un correo electrónico aparecerá la tecla @).
Nota: El atributo inputType admite los siguientes valores (en negrita los que has de utilizar en este ejercicio): none, text, textCapCharacters, textCapWords, textCapSentences, textAutoCorrect, textAutoComplete, textMultiLine, textImeMultiLine, textNoSuggestions, textUri, textEmailAddress, textEmailSubject, textShortMessage, textLongMessage, textPersonName, textPostalAddress, textPassword, textVisiblePassword, textWebEditText, textFilter, textPhonetic, textWebEmailAddress, textWebPassword, number, numberSigned, numberDecimal, numberPassword, phone, datetime, date y time.
5. Abre la clase MainActivity
y en el método onCreate()
reemplaza:
setContentView(R.layout.activity_main.edicion_lugar);
6. Comenta el resto de la líneas de este método que hay debajo usando /*
... */
. Como ya no se crea el layout activity_main los id
de vista a los que se accede ya no existen.
7. Ejecuta la aplicación y verifica como cambia el tipo de teclado en cada EditText
8. Deshaz el cambio realizado en el ponto 5 y 6.
Solución:
<android.support.v4.widget.NestedScrollView xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent" app:layout_behavior="@string/appbar_scrolling_view_behavior"> <android.support.constraint.ConstraintLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/relativeLayout"> <TextView android:id="@+id/t_nombre" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Nombre:" android:textAppearance="?android:attr/textAppearanceMedium" app:layout_constraintTop_toTopOf="parent" app:layout_constraintStart_toStartOf="parent" android:layout_marginStart="8dp" android:layout_marginTop="8dp"/> <EditText android:id="@+id/nombre" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="algo que identifique el lugar" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@id/t_nombre" android:layout_marginStart="8dp"> <requestFocus/> </EditText> <TextView android:id="@+id/t_tipo" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Tipo:" android:textAppearance="?android:attr/textAppearanceMedium" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@id/nombre" android:layout_marginStart="8dp" android:layout_marginTop="8dp"/> <Spinner android:id="@+id/tipo" android:layout_width="wrap_content" android:layout_height="wrap_content" app:layout_constraintTop_toTopOf="@id/t_tipo" app:layout_constraintLeft_toRightOf="@id/t_tipo"/> <TextView android:id="@+id/t_direccion" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Dirección:" android:textAppearance="?android:attr/textAppearanceMedium" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@id/t_tipo" android:layout_marginStart="8dp" android:layout_marginTop="8dp"/> <EditText android:id="@+id/direccion" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="dirección del lugar" android:inputType="textPostalAddress" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@id/t_direccion" android:layout_marginStart="8dp"/> <TextView android:id="@+id/t_telefono" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Telefono:" android:textAppearance="?android:attr/textAppearanceMedium" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@id/direccion" android:layout_marginStart="8dp" android:layout_marginTop="8dp"/> <EditText android:id="@+id/telefono" android:layout_width="0dp" android:layout_height="wrap_content" android:hint="teléfono para contactar" android:inputType="phone" app:layout_constraintLeft_toRightOf="@id/t_telefono" app:layout_constraintEnd_toEndOf="parent" android:layout_marginEnd="8dp" app:layout_constraintStart_toEndOf="@+id/t_telefono" android:layout_marginStart="8dp" app:layout_constraintBaseline_toBaselineOf="@+id/t_telefono"/> <TextView android:id="@+id/t_url" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Url:" android:textAppearance="?android:attr/textAppearanceMedium" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@id/telefono" android:layout_marginStart="8dp" android:layout_marginTop="8dp"/> <EditText android:id="@+id/url" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="página web" android:inputType="textUri" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@id/t_url" android:layout_marginStart="8dp"/> <TextView android:id="@+id/t_comentario" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Comentario:" android:textAppearance="?android:attr/textAppearanceMedium" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@id/url" android:layout_marginStart="8dp" android:layout_marginTop="8dp"/> <EditText android:id="@+id/comentario" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="introduce tus notas" android:inputType="textMultiLine" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@id/t_comentario" android:layout_marginStart="8dp"/> </android.support.constraint.ConstraintLayout> </android.support.v4.widget.NestedScrollView>