Construyendo una calculadora de propinas en Kotlin: ¿cómo funciona?
Le mostramos cómo crear una aplicación simple de cálculo de propinas en Kotlin. Para ser más precisos, Kotlin 1.3.21, Android 4, Android Studio 3. El artículo será interesante, en primer lugar, para aquellos que comienzan su camino en el desarrollo de aplicaciones para Android. Le permite comprender qué y cómo funciona dentro de la aplicación.
Dicha calculadora es útil cuando necesita calcular la cantidad de propinas de una empresa que decide pasar tiempo en un restaurante o cafetería. Por supuesto, no todos y no siempre dejan té para los camareros, esto es más una tradición occidental, pero el proceso de desarrollo de una aplicación de este tipo es interesante en cualquier caso.
Recordamos:para todos los lectores de "Habr": un descuento de 10 rublos al inscribirse en cualquier curso de Skillbox utilizando el código promocional "Habr".
Así es como se ve la aplicación cuando se está ejecutando:
Ingresa el porcentaje deseado del monto total, la cantidad de participantes en la reunión y obtiene el resultado: la cantidad de propinas que deben quedar.
Начинаем
La interfaz completa de la aplicación se ve así:
Primera acción - descarga base del proyecto. Ábralo en Android Studio 3.0 o posterior. Construimos y ejecutamos el proyecto y vemos una pantalla blanca. Todo está bien, como debe ser.
Las acciones del usuario se escriben en el proyecto en orden cronológico, para que todo quede claro. Para verlo, abra Ver -> Ventanas de herramientas -> TODO.
Estudiamos el proyecto y abrimos colors.xml para evaluar la paleta de colores. strings.xml contiene datos de texto (títulos) y styles.xml contiene varias plantillas de fuentes.
Desarrollo de la sección de costos
Abra activity_main.xml y agregue el siguiente código a LinearLayout (#1):
Dado que la tarea principal de la aplicación es calcular los costos individuales para cada uno de los participantes en las reuniones en el restaurante, costPerPersonTextView juega el papel principal.
EditText limita la entrada a una línea, este parámetro debe establecerse en NumberDecimal inputType.
Iniciamos el proyecto para la prueba e ingresamos los parámetros del daño total (tazas rotas, platos, etc.)
Desarrollo de la sección "Personas y Consejos"
Para agregar un selector de monto de propina, pegue el código a continuación en una nueva sección LinearLayout (#4):
Este fragmento de código es necesario para calcular con precisión el monto de la propina. El valor de texto predeterminado es 20. Los ImageButtons se proporcionan con iconos en una carpeta con permisos de escritura.
Copie toda la sección y agregue lo siguiente (#5):
Identificadores de ImageButton (restar PeopleButton, agregar PeopleButton)
ID de TextView (numberOfPeopleStaticText, numberOfPeopleTextView)
DefaultText para numberOfPeopleTextView (debe ser 4).
Ahora, al iniciar la aplicación, es posible agregar el monto de la factura, los botones Agregar / Restar también funcionan, pero todavía no pasa nada.
Agregar vistas
Abra MainActivity.kt y agréguelo a la función initViews (#6):
¡En términos de botones e interruptores, Kotlin tiene todo organizado muy bien! Agregue el siguiente código a todas las funciones de incremento y decremento
(#9 –#12):
private fun incrementTip() {
if (tipPercent != MAX_TIP) {
tipPercent += TIP_INCREMENT_PERCENT
tipTextView.text = String.format("%d%%", tipPercent)
}
}
private fun decrementTip() {
if (tipPercent != MIN_TIP) {
tipPercent -= TIP_INCREMENT_PERCENT
tipTextView.text = String.format("%d%%", tipPercent)
}
}
private fun incrementPeople() {
if (numberOfPeople != MAX_PEOPLE) {
numberOfPeople += PEOPLE_INCREMENT_VALUE
numberOfPeopleTextView.text = numberOfPeople.toString()
}
}
private fun decrementPeople() {
if (numberOfPeople != MIN_PEOPLE) {
numberOfPeople -= PEOPLE_INCREMENT_VALUE
numberOfPeopleTextView.text = numberOfPeople.toString()
}
}
Aquí el código protege las funciones de incremento con valores máximos (MAX_TIP & MAX_PEOPLE). Además, el código protege las funciones de decremento con valores mínimos (MIN_TIP & MIN_PEOPLE).
Ahora vinculamos los botones a los oyentes en la función initViews (#13):
private fun initViews() {
...
addTipButton.setOnClickListener(this)
subtractTipButton.setOnClickListener(this)
addPeopleButton.setOnClickListener(this)
subtractPeopleButton.setOnClickListener(this)
//TODO #15: Bind EditText to TextWatcher
}
Ahora puede agregar daños totales, propinas y el número de participantes de la reunión. Bueno, ahora lo más importante...
Sección de costos
Este código calcula los costos (#14):
private fun calculateExpense() {
val totalBill = billEditText.text.toString().toDouble()
val totalExpense = ((HUNDRED_PERCENT + tipPercent) / HUNDRED_PERCENT) * totalBill
val individualExpense = totalExpense / numberOfPeople
expensePerPersonTextView.text = String.format("$%.2f", individualExpense)
}
Bueno, aquí se llama una función que permite tener en cuenta el número de personas en la empresa y calcular la propina (#15):
private fun incrementTip() {
…
}
private fun decrementTip() {
…
}
private fun incrementPeople() {
…
}
private fun decrementPeople() {
…
}
Lanzamos la aplicación. Se ve y funciona muy bien. Pero podría ser mejor.
Si intenta eliminar el monto de la factura y luego aumenta la cantidad de sugerencias o amigos, la aplicación se bloqueará porque todavía no hay verificación de costos cero. Además, si intenta cambiar el monto de la factura, los cargos no se actualizarán.