Ejercicio: Conversor de moneda en Kotlin

Convertir $ a € y viceversa usando Kotlin

Ejercicio: Conversor de moneda

Creación del proyecto: Conversor

Creación del layout activity_main.xml ?

 

Qué es un objeto en Kotlin?

Pasar una cadena de texto a número y viceversa:

Conversion.kt

object Conversion {
    @Throws(NumberFormatException::class)
    fun convertirADolares(cantidad: String, cambio: Double): String {
        val valor = cantidad.toDouble() / cambio
        return java.lang.Double.toString(valor)
        //return String.valueOf(valor);
    }

    @Throws(NumberFormatException::class)
    fun convertirAEuros(cantidad: String, cambio: Double): String {
        val valor = cantidad.toDouble() * cambio
        return String.format("%.2f", valor)
    }
}

Use view binding to replace findViewById

View Binding

Ejercicio: Conversor de moneda usando View Binding

en el fichero build.gradle se deben añadir estas líneas:

buildFeatures {
    viewBinding = true
}

Fichero build.gradle(Module :app):

plugins {
    id("com.android.application")
    id("org.jetbrains.kotlin.android")
}

android {
    namespace = "com.example.conversor"
    compileSdk = 34

    buildFeatures {
        viewBinding = true
    }

    defaultConfig {
        applicationId = "com.example.conversor"
        minSdk = 28
        targetSdk = 34
        versionCode = 1
        versionName = "1.0"

        testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
    }

. . .

 

MainActivity.kt:

class MainActivity : AppCompatActivity(), View.OnClickListener {
    companion object {
        const private val RATIO = 0.87
    }

    private lateinit var binding: ActivityMainBinding

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        /*
        enableEdgeToEdge()
        setContentView(R.layout.activity_main)
        ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main)) { v, insets ->
            val systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars())
            v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom)
            insets
        }
        */
        //activity_main.xml -> ActivityMainBinding
        binding = ActivityMainBinding.inflate(layoutInflater)
        val view: View = binding.root
        setContentView(view)

        binding.convertir.setOnClickListener(this)
    }

    override fun onClick(view: View) {
        lateinit var valor: String

        if (view === binding.convertir) {
            try {
                if (binding.EurosADolares.isChecked) {
                    valor = binding.euros.text.toString()
                    if (!valor.isEmpty())
                        binding.dolares.setText(Conversion.convertirADolares(valor, RATIO))
                    else
                        mostrarMensaje("Introduce un valor en los Euros")
                } else {
                    valor = binding.dolares.text.toString()
                    if (!valor.isEmpty())
                        binding.euros.setText(Conversion.convertirAEuros(valor, RATIO))
                    else
                        mostrarMensaje("Introduce un valor en los Dólares")
                }
            } catch (e: NumberFormatException) {
                mostrarMensaje("Error en la conversión: " + e.message)
            }
        }
    }

    private fun mostrarMensaje(texto: String) {
        Toast.makeText(this, texto, Toast.LENGTH_SHORT).show()
    }
}

 

Mejora: Quitar el botón de convertir y actualizar el cambio cuando se modifique el contenido de un cuadro de texto

onTextChangedListener in Android

 

Ejercicio 1 de la tarea online de la unidad 2

Deja una respuesta