Este codelab es parte del curso Conceptos básicos de Kotlin para Android. Aprovecharás al máximo este curso si trabajas con los codelabs en secuencia. Todos los codelabs del curso se detallan en la página de destino de codelabs sobre los aspectos básicos de Kotlin para Android.
Conocimientos que ya deberías tener
- Cómo crear una app básica de Android en Kotlin
- Ejecución de una app para Android en un emulador o dispositivo
- Creación de un diseño lineal con el editor de diseño de Android Studio
- Crear una app simple que use
LinearLayout
,TextView
,ScrollView
y un botón con un controlador de clics
Qué aprenderás
- Cómo obtener la entrada del usuario mediante una vista
EditText
- Cómo establecer el texto en una vista
TextView
con el texto de la vistaEditText
. - Cómo trabajar con
View
yViewGroup
- Cómo cambiar la visibilidad de un objeto
View
Actividades
- Agregarás interactividad a la app AboutMe, que es de un codelab anterior.
- Agrega un elemento
EditText
para que el usuario pueda ingresar texto. - Agrega un
Button
y, luego, implementa su controlador de clics.
En este codelab, extenderás la app de AboutMe para agregar la interacción del usuario. Para mostrar el sobrenombre, agrega un campo de sobrenombre, un botón LISTO y una vista de texto. Una vez que el usuario ingrese un sobrenombre y presione el botón LISTO, se actualizará la vista de texto para mostrar el sobrenombre ingresado. El usuario puede presionar la vista de texto para volver a actualizar el sobrenombre.
En esta tarea, agregarás un campo de entrada EditText
para permitir que el usuario ingrese un sobrenombre.
Paso 1: Comienza
- Si todavía no tienes la app AboutMe de un codelab anterior, descarga el código de inicio, AboutMeInteractive-Starter. Es el mismo código que terminaste en un codelab anterior.
- Abre el proyecto AboutMeInteractive-Starter en Android Studio.
- Ejecuta la app. Verás una vista de texto del nombre, una imagen de estrella y un segmento largo de texto en una vista de desplazamiento.
Observa que el usuario no puede cambiar nada de texto.
Las apps son más interesantes si el usuario puede interactuar con ellas, por ejemplo, si puede ingresar texto. Para aceptar entradas de texto, Android proporciona un widget de interfaz de usuario (IU) llamado edición de texto. Para definir un texto de edición, utiliza EditText
, una subclase de TextView
. Un texto de edición permite al usuario ingresar y modificar entradas de texto, como se muestra en la siguiente captura de pantalla.
Paso 2: Agrega un EditText
- En Android Studio, abre el archivo de diseño
activity_main.xml
en la pestaña Design. - En el panel Palette, haz clic en Text.
Ab TextView, que es unaTextView
, se muestra en la parte superior de la lista de elementos de texto del panel Palette. Debajo de Ab TextView hay varias vistasEditText
.
En el panel Palette, observa cómo el ícono deTextView
muestra las letras Ab sin guion bajo. Sin embargo, los íconosEditText
muestran Ab con un guion bajo. El guion bajo indica que la vista se puede editar.
Para cada una de las vistasEditText
, Android establece diferentes atributos, y el sistema muestra el método de entrada táctil correspondiente (como un teclado en pantalla). - Arrastra un elemento de texto de PlainText al árbol de componentes y colócalo debajo del
name_text
y arriba delstar_image
. - Usa el panel Attributes para establecer los siguientes atributos en la vista
EditText
.
Atributo | Valor |
|
|
|
|
|
|
- Ejecuta la app. Arriba de la imagen en estrella, verás un texto de edición con un texto predeterminado "Name".
En esta tarea, diseñarás tu vista de EditText
agregando una sugerencia, cambiando la alineación del texto, cambiando el estilo a NameStyle
y configurando el tipo de entrada.
Paso 1: Agrega texto de sugerencia
- Agrega un nuevo recurso de strings para la sugerencia en el archivo
string.xml
.
<string name="what_is_your_nickname">What is your Nickname?</string>
- Usa el panel Attributes para establecer los siguientes atributos en la vista
EditText
:
Atributo | Valor |
|
|
| (centro) |
|
|
- En el panel Attributes, quita el valor
Name
del atributotext
. El valor del atributotext
debe estar vacío para que se muestre la sugerencia.
Paso 2: Configure el atributo inputType
El atributo inputType
especifica el tipo de entrada que los usuarios pueden ingresar en la vista EditText
. El sistema Android muestra el campo de entrada correspondiente y el teclado en pantalla, según el tipo de entrada configurado.
Para ver todos los tipos de entrada posibles, en el panel Attributes, haz clic en el campo inputType
o en los tres puntos ... junto al campo. Se abrirá una lista que muestra todos los tipos de entrada que puedes usar, con el tipo de entrada activo actualmente. Puedes seleccionar más de un tipo de entrada.
Por ejemplo, para contraseñas, usa el valor textPassword
. El campo de texto oculta la entrada del usuario.
Para números de teléfono, usa el valor phone
. Se muestra un teclado numérico y el usuario solo puede ingresar números.
Establece el tipo de entrada para el campo de sobrenombre:
- Establece el atributo
inputType
entextPersonName
para el texto de ediciónnickname_edit
. - En el panel Component Tree, observa una advertencia de
autoFillHints
. Esta advertencia no se aplica a esta app y está fuera del alcance de este codelab, por lo que puedes ignorarla. (Si quieres obtener más información sobre el autocompletado, consulta Cómo optimizar tu app para el autocompletado). - En el panel Attributes, verifica los valores de los siguientes atributos de la vista
EditText
:
Atributo | Valor |
|
|
|
|
|
|
|
|
|
|
|
|
| (vacío) |
Un Button
es un elemento de la IU que el usuario puede presionar para realizar una acción. Un botón puede ser texto, un ícono o ambos, y un ícono.
En esta tarea, agregarás el botón LISTO, que el usuario presiona después de escribir un sobrenombre. El botón cambia la vista EditText
por una vista TextView
que muestra el sobrenombre. Para actualizar el sobrenombre, el usuario puede presionar la vista TextView
.
Paso 1: Agrega un botón LISTO
- Arrastra un botón del panel Palette a Component Tree. Coloca el botón debajo del texto
nickname_edit
edit. - Crea un nuevo recurso de strings llamado
done
. Asígnale a la string un valor deDone
.
<string name="done">Done</string>
- Usa el panel Attributes para configurar los siguientes atributos en la vista
Button
agregada recientemente:
Atributo | Valores |
|
|
|
|
|
|
|
|
El atributo layout_gravity
centra la vista en su diseño superior, LinearLayout
.
- Cambia el estilo a
Widget.AppCompat.Button.Colored
, que es uno de los estilos predefinidos que proporciona Android. Puedes seleccionar el estilo en el menú desplegable o en la ventana Resources.
Este estilo cambia el color del botón al de acento,colorAccent
. El color de los elementos destacados se define en el archivores/values/colors.xml
.
El archivo colors.xml
contiene los colores predeterminados de tu app. Puedes agregar nuevos recursos de color o cambiar los recursos de color existentes en tu proyecto, según los requisitos de tu app.
Archivo colors.xml
de muestra:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<color name="colorPrimary">#008577</color>
<color name="colorPrimaryDark">#00574B</color>
<color name="colorAccent">#D81B60</color>
</resources>
Paso 2: Personaliza el botón LISTO
- En el panel Attributes, agrega un margen superior seleccionando Layout_Margin > Top. Establece el margen superior en
layout_margin
, que se define en el archivodimens.xml
. - Establece el atributo
fontFamily
enroboto
desde el menú desplegable. - Ve a la pestaña Text y verifica el código XML que se generó para el botón recién agregado.
<Button
android:id="@+id/done_button"
style="@style/Widget.AppCompat.Button.Colored"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginTop="@dimen/layout_margin"
android:fontFamily="@font/roboto"
android:text="@string/done" />
Paso 3: Cambia el recurso de color
En este paso, cambiarás el color de los elementos destacados para que coincida con la barra de la app de tu actividad.
- Abre
res/values/colors.xml
y cambia el valor decolorAccent
a#76bf5e
.
<color name="colorAccent">#76bf5e</color>
Puedes ver el color correspondiente al código hexadecimal, en el margen izquierdo del editor de archivos.
Observa el cambio de color del botón en el editor de diseño.
- Ejecuta la app. Deberías ver un botón con estilo LISTO debajo del texto de edición.
Después de que el usuario ingrese un sobrenombre y presione el botón LISTO, se mostrará en una vista de TextView
. En esta tarea, agregarás una vista de texto con un fondo de color. La vista de texto muestra el sobrenombre del usuario sobre la star_image
.
Paso 1: Agrega un elemento TextView para el sobrenombre
- Arrastra una vista de texto del panel Palette al árbol de componentes. Coloca la vista de texto debajo del
done_button
y arriba de lastar_image
. - Usa el panel Attributes a fin de configurar los siguientes atributos para la vista nueva
TextView
:
Atributo | Valor |
|
|
|
|
| (centro) |
Paso 2: Cambia la visibilidad de TextView
Puedes mostrar u ocultar vistas en tu app con el atributo visibility
. Este atributo toma uno de los siguientes tres valores:
visible
: La vista es visible.Invisible
: Oculta la vista, pero esta sigue ocupando espacio en el diseño.gone
: Oculta la vista, y esta no ocupa espacio en el diseño.
- En el panel Attributes, establece el elemento
visibility
de la vista de textonickname_text
engone
, ya que no quieres que tu app muestre esta vista de texto al principio.
Observa que, cuando cambias el atributo en el panel Attributes, la vistanickname_text
desaparece del editor de diseño. La vista está oculta en la vista previa de diseño. - Cambia el valor del atributo
text
de la vistanickname_text
a una string vacía.
El código XML generado para este objeto TextView
debería ser similar al siguiente:
<TextView
android:id="@+id/nickname_text"
style="@style/NameStyle"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textAlignment="center"
android:visibility="gone"
android:text="" />
La vista previa de diseño debería tener el siguiente aspecto:
Un controlador de clics en el objeto Button
(o en cualquier vista) especifica la acción que se realizará cuando se presiona el botón (ver). La función que controla el evento de clic debe implementarse en el Activity
que aloja el diseño con el botón (ver).
El objeto de escucha de clics tiene genéricamente este formato, en el que la vista pasada es la vista que recibió el clic o el toque.
private fun clickHandlerFunction(viewThatIsClicked: View) {
// Add code to perform the button click event
}
Puedes adjuntar la función de escucha de clics a los eventos de clic de botón de dos maneras:
- En el diseño XML, puedes agregar el atributo
android:onClick
al elemento<Button>
. Por ejemplo:
<Button
android:id="@+id/done_button"
android:text="@string/done"
...
android:onClick="clickHandlerFunction"/>
O
- Puedes hacerlo de manera programática en el entorno de ejecución, en
onCreate()
deActivity
, llamando asetOnClickListener
. Por ejemplo:
myButton.setOnClickListener {
clickHanderFunction(it)
}
En esta tarea, agregarás un objeto de escucha de clics para el elemento done_button
de manera programática. Agrega el objeto de escucha de clics en la actividad correspondiente, que es MainActivity.kt
.
La función de objeto de escucha de clics, llamada addNickname
, hará lo siguiente:
- Obtén el texto del texto de edición
nickname_edit
. - Establece el texto en la vista de texto
nickname_text
. - Oculta el texto y el botón de edición.
- Muestra el sobrenombre
TextView
.
Paso 1: Agrega un objeto de escucha de clics
- En Android Studio, en la carpeta
java
, abre el archivoMainActivity.kt
. - En
MainActivity.kt
, dentro de la claseMainActivity
, agrega una función llamadaaddNickname
. Incluye un parámetro de entrada llamadoview
de tipoView
. El parámetroview
es elView
en el que se llama a la función. En este caso,view
será una instancia de tu botón LISTO.
private fun addNickname(view: View) {
}
- Dentro de la función
addNickname
, usafindViewById()
para obtener una referencia al texto de ediciónnickname_edit
y a la vista de textonickname_text
.
val editText = findViewById<EditText>(R.id.nickname_edit)
val nicknameTextView = findViewById<TextView>(R.id.nickname_text)
- Configura el texto de la vista de texto
nicknameTextView
para el texto que el usuario ingresó eneditText
y obtenlo de la propiedadtext
.
nicknameTextView.text = editText.text
- Para ocultar la vista de sobrenombre
EditText
, configura la propiedadvisibility
deeditText
comoView.GONE
.
En una tarea anterior, cambiaste la propiedad de visibility
con el editor de diseño. Aquí hace lo mismo de manera programática.
editText.visibility = View.GONE
- Para ocultar el botón LISTO, configura la propiedad
visibility
comoView.GONE
. Ya tienes la referencia del botón como el parámetro de entrada de la función,view
.
view.visibility = View.GONE
- Al final de la función
addNickname
, configura la propiedadvisibility
comoView.VISIBLE
para hacer que la vista del sobrenombreTextView
sea visible.
nicknameTextView.visibility = View.VISIBLE
Paso 2: Adjunta el objeto de escucha de clics al botón LISTO
Ahora que tienes una función que define la acción que se debe realizar cuando se presiona el botón LISTO, debes adjuntar la función a la vista Button
.
- En
MainActivity.kt
, al final de la funciónonCreate()
, obtén una referencia a la vista LISTOButton
. Usa la funciónfindViewById()
y llama asetOnClickListener
. Pasa una referencia a la función de escucha de clics,addNickname()
.
findViewById<Button>(R.id.done_button).setOnClickListener {
addNickname(it)
}
En el código anterior, it
hace referencia al done_button
, que es la vista pasada como el argumento.
- Ejecuta la app, ingresa un sobrenombre y presiona el botón LISTO. Observa cómo el texto de edición y el botón se reemplazan por la vista de texto del sobrenombre.
Ten en cuenta que, incluso después de que el usuario presiona el botón LISTO, el teclado permanece visible. Este es el comportamiento predeterminado.
Paso 3: Ocultar el teclado
En este paso, agregarás código para ocultar el teclado después de que el usuario presione el botón LISTO.
- En
MainActivity.kt
, al final de la funciónaddNickname()
, agrega el siguiente código. Si deseas obtener más información sobre cómo funciona este código, consulta la documentación dehideSoftInputFromWindow
.
// Hide the keyboard.
val inputMethodManager = getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
inputMethodManager.hideSoftInputFromWindow(view.windowToken, 0)
- Vuelve a ejecutar tu app. Ten en cuenta que, después de presionar LISTO, el teclado estará oculto.
El usuario no puede cambiar el sobrenombre después de que presiona el botón LISTO. En la próxima tarea, agregarás más funcionalidad a la app y agregarás funcionalidad para que el usuario pueda actualizar el sobrenombre.
En esta tarea, agregarás un objeto de escucha de clics a la vista de texto del sobrenombre. El objeto de escucha de clics oculta la vista de texto del sobrenombre, muestra el texto de edición y muestra el botón LISTO.
Paso 1: Agrega un objeto de escucha de clics
- En
MainActivity
, agrega una función de escucha de clics llamadaupdateNickname(view: View)
para la vista de texto del sobrenombre.
private fun updateNickname (view: View) {
}
- Dentro de la función
updateNickname
, obtén una referencia al texto de ediciónnickname_edit
y una referencia al botón LISTO. Para ello, usa el métodofindViewById()
.
val editText = findViewById<EditText>(R.id.nickname_edit)
val doneButton = findViewById<Button>(R.id.done_button)
- Al final de la función
updateNickname
, agrega código para mostrar el texto de edición, muestra el botón LISTO y oculta la vista de texto.
editText.visibility = View.VISIBLE
doneButton.visibility = View.VISIBLE
view.visibility = View.GONE
- En
MainActivity.kt
, al final de la funciónonCreate()
, llama asetOnClickListener
en la vista de textonickname_text
. Pasa una referencia a la función de escucha de clics, que esupdateNickname()
.
findViewById<TextView>(R.id.nickname_text).setOnClickListener {
updateNickname(it)
}
- Ejecuta la app. Ingresa un sobrenombre, presiona el botón LISTO y, luego, presiona la vista de sobrenombre
TextView
. La vista de sobrenombre desaparece y el texto editado y el botón LISTO se vuelven visibles.
Ten en cuenta que, de forma predeterminada, la vista EditText
no tiene foco, y el teclado no es visible. Es difícil para el usuario descubrir que se puede hacer clic en la vista de texto del sobrenombre. En la siguiente tarea, agregarás el foco y un estilo a la vista de texto del sobrenombre.
Paso 2: Establece el enfoque en la vista EditText y muestra el teclado
- Al final de la función
updateNickname
, establece el enfoque en la vistaEditText
. Usa el métodorequestFocus()
.
// Set the focus to the edit text.
editText.requestFocus()
- Al final de la función
updateNickname
, agrega código para que el teclado sea visible.
// Show the keyboard.
val imm = getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
imm.showSoftInput(editText, 0)
Paso 3: Agrega un color de fondo a la vista de TextView del sobrenombre
- Establece el color de fondo de la vista de texto
nickname_text
en@color/colorAccent
y agrega un padding inferior de@dimen/small_padding
. Estos cambios servirán para indicarle al usuario que se puede hacer clic en la vista de texto del sobrenombre.
android:background="@color/colorAccent"
android:paddingBottom="@dimen/small_padding"
- Ejecuta la app final. Se enfoca el texto de edición, se muestra el sobrenombre en el texto de edición y se le da estilo a la vista de texto del sobrenombre.
Ahora, muéstrale a tu amigo tu app de AboutMe interactiva.
Proyecto de Android Studio: AboutMeInteractive
- La herramienta Layout Editor de Android Studio es un editor de diseño visual. Puedes usar el editor de diseño para compilar el diseño de tu app arrastrando elementos de la IU al diseño.
EditText
es un elemento de la IU que le permite al usuario ingresar y modificar texto.- Un
Button
es un elemento de la IU que el usuario puede presionar para realizar una acción. Un botón puede ser texto, un ícono o ambos, y un ícono.
Objetos de escucha de clics
- Puedes hacer que cualquier
View
responda cuando se lo presiona agregando un objeto de escucha de clics. - La función que define el objeto de escucha de clics recibe el
View
en el que se hace clic.
Puedes adjuntar una función de escucha de clics a un objeto View
de dos maneras:
- En el diseño XML, agrega el atributo
android:onClick
al elemento<
View
>
. - De manera programática, usa la función
setOnClickListener(View.OnClickListener)
en el elementoActivity
correspondiente.
Curso de Udacity:
Documentación para desarrolladores de Android:
En esta sección, se enumeran las posibles tareas para los alumnos que trabajan con este codelab como parte de un curso que dicta un instructor. Depende del instructor hacer lo siguiente:
- Si es necesario, asigna la tarea.
- Informa a los alumnos cómo enviar los deberes.
- Califica las tareas.
Los instructores pueden usar estas sugerencias lo poco o lo que quieran, y deben asignar cualquier otra tarea que consideren apropiada.
Si estás trabajando en este codelab por tu cuenta, usa estas tareas para poner a prueba tus conocimientos.
Responde estas preguntas
Pregunta 1
¿Cuál es la subclase de EditText
?
View
LinearLayout
TextView
Button
Pregunta 2
¿Cuál de los siguientes valores de atributo visibility
, si se configura en una vista, hace que la vista esté oculta y no ocupe espacio en el diseño?
visible
Invisible
gone
hide
Pregunta 3
Para las vistas de EditText
, no es una buena práctica proporcionar sugerencias, ya que estas obstruyen el campo de entrada. ¿Verdadero o falso?
- Verdadero
- Falso
Pregunta 4
¿Cuál de estas afirmaciones sobre las vistas Button
es verdadera?
- Una vista de
Button
es un grupo de vistas. - Solo puedes tener tres vistas
Button
por pantalla. - Las vistas
Button
son elementos en los que se puede hacer clic y, cuando lo haces, el objeto de escucha de clics adjunto realiza una acción. Button
es una extensión deImageView
.
Comienza la siguiente lección:
Para ver vínculos a otros codelabs de este curso, consulta la página de destino de codelabs sobre aspectos básicos de Kotlin para Android.