Day: November 25, 2020

em kotlin: uma calculadora

Construir uma calculadora:

ficheiro: MainActivity.kt

package pt.deis.estuda.calculadora

import android.graphics.Color
import android.icu.number.NumberFormatter
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.view.View
import android.widget.Button
import android.widget.TextView

class MainActivity : AppCompatActivity() {

    lateinit var tvDisplay: TextView

    //variave para ligar a maquina
    var strDisplay = "0.0"
    var novoNumero = true

    //para tratar do %
    val numeroCorente : Double
        //caso dê erro converter fica com 0.0
        //o então escrever error
        get()=strDisplay.toDoubleOrNull() ?: 0.0

    //variavel para lidar com a operação
    //v1
    /*
    enum class Ops{
        NONE, ADD, SUB, MUL, DIv
    }

    var op = Ops.NONE
    */
    //v2
    //id da operação
    var operador = 0
        //alterar a cor do operador
        set(value){
            if(field !=0 ){
                findViewById<Button>(field).setTextColor(Color.BLACK)
            }
            if(value !=0){
                findViewById<Button>(value).setTextColor(Color.GREEN)
            }
            field =value
        }
    var numeroAntigo = 0.0

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        tvDisplay = findViewById(R.id.tvDisplay)
        updateDisplay() //para mostrar o 0.0

    }

    fun updateDisplay(){
        tvDisplay.text = strDisplay
    }

    fun onDigit(view: View) {
        ///ir buscar o texto do botão e adicionar à caixa
        val btn = view as Button

        //para resolver a situaçãod e ser a primeira vez
        if(novoNumero) {
            strDisplay = btn.text.toString()
        }
        else {
            strDisplay += btn.text //concatenar ao que lá está
        }
        updateDisplay()

        //para que efectivamente faça a concatenação
        novoNumero = false
    }

    fun onPonto(view: View) {
        //só pode exisir um ponto no numero
        if(novoNumero) {
            strDisplay = "0."
        }else{
            //adicionar o ponto, mas testar se já existe
            if(strDisplay.contains('.'))
                return
            strDisplay += "."
        }
        updateDisplay()
        novoNumero = false
    }
    fun onAC(view: View) {
        strDisplay = "0.0"
        novoNumero = true
        updateDisplay()
    }
    fun onPM(view: View) {
        //o sinal do mais menos
        if(strDisplay[0] == '-'){
            strDisplay = strDisplay.substring(1)
        }else{
            //ou strDisplay = "-"+strDisplay //v1
            strDisplay = "-$strDisplay" //v2
        }
        updateDisplay()
    }
    fun onPer(view: View) {
        //dividir o valor que existe por 100
        strDisplay = "" + numeroCorente / 100.0
        updateDisplay()
        //talvez não usar o true
        //true: não permite acrescentar mais caracteres
        novoNumero = true
    }

    //versão individual do onOper
    //v1
    fun onMais(view: View) {}
    fun onSub(view: View) {}
    fun onDiv(view: View) {}
    fun onMultiplica(view: View) {}


    //v2
    fun onOper(view : View){
        //manter as operações
        if(operador != 0 && !novoNumero){
            onIgual(view)
        }

        numeroAntigo = numeroCorente
        novoNumero = true
        operador = view.id

    }
    fun onIgual(view: View) {
        var calculo = 0.0
        when(operador){
            R.id.bntMais -> calculo = numeroCorente + numeroAntigo
            R.id.btnMul -> calculo = numeroCorente * numeroAntigo
            R.id.bntSub -> calculo = numeroAntigo - numeroCorente
            R.id.bntDiv ->  calculo = if(numeroCorente != 0.0) numeroAntigo / numeroCorente else 0.0
            //caso não tenha operador para fazer
            else -> return
        }
        //actualizar de seguida o display
        strDisplay = "$calculo"
        novoNumero = true
        operador = 0
        //manter o numero
        numeroAntigo = calculo
        updateDisplay()
    }
}

ficheiro: themes.xml

<resources xmlns:tools="http://schemas.android.com/tools">
    <!-- Base application theme. -->
    <img src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" data-wp-preserve="%3Cstyle%20name%3D%22Theme.Calculadora%22%20parent%3D%22Theme.AppCompat.Light.DarkActionBar%22%3E%0A%20%20%20%20%20%20%20%20%3C!--%20alterar%20o%20tema%20aqui.%20--%3E%0A%0A%20%20%20%20%20%20%20%20%3C!--%20cor%20preta%20default%20--%3E%0A%20%20%20%20%20%20%20%20%3Citem%20name%3D%22android%3AtextColor%22%3E%23000000%3C%2Fitem%3E%0A%0A%20%20%20%20%3C%2Fstyle%3E" data-mce-resize="false" data-mce-placeholder="1" class="mce-object" width="20" height="20" alt="&lt;style&gt;" title="&lt;style&gt;" />
</resources>

ficheiro: activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity"
    android:orientation="vertical"
    android:background="#c0c0c0"
    android:padding="16dp"
    >

    <TextView
        android:id="@+id/tvDisplay"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="0.0"
        android:gravity="right"
        android:textSize="24sp"
        android:padding="16dp"
        android:background="#ffffc0"
        android:layout_marginBottom="20dp"
       />

    <!--
         android:layout_height="0dp"      //distribuir o espaço da mesma forma (é o peso)
         android:layout_weight="1"     //por termos peso a altura tem que ter 0dp
         -->
    <LinearLayout

        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"
        android:orientation="horizontal">

        <!--
         android:id="@+id/bntAC"        //atribuir sempre um id
         android:layout_weight="1"      //distribuir o espaço da mesma forma (é o peso)
         android:layout_width="0dp"     //por termos peso a largura tem que ter 0dp

         -->
        <Button
            android:id="@+id/bntAC"
            android:layout_width="0dp"
            android:layout_weight="1"
            android:layout_height="match_parent"
            android:text="AC"
            android:textSize="20sp"
            android:onClick="onAC"
            />
        <Button
            android:id="@+id/bntPM"
            android:layout_width="0dp"
            android:layout_weight="1"
            android:layout_height="match_parent"
            android:text="+/-"
            android:textSize="20sp"
            android:onClick="onPM"
            />
        <Button
            android:id="@+id/bntPerc"
            android:layout_width="0dp"
            android:layout_weight="1"
            android:layout_height="match_parent"
            android:text="%"
            android:textSize="20sp"
            android:onClick="onPer"
            />
        <Button
            android:id="@+id/bntDiv"
            android:layout_width="0dp"
            android:layout_weight="1"
            android:layout_height="match_parent"
            android:text="/"
            android:textSize="20sp"
            android:onClick="onOper"
            />
    </LinearLayout>
    <LinearLayout

        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"
        android:orientation="horizontal">

        <!--
         android:id="@+id/bntAC"        //atribuir sempre um id
         android:layout_weight="1"      //distribuir o espaço da mesma forma (é o peso)
         android:layout_width="0dp"     //por termos peso a largura tem que ter 0dp

        android:onClick="onDigit" é uma funça
         -->
        <Button
            android:id="@+id/bnt7"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:onClick="onDigit"
            android:text="7"
            android:textSize="20sp" />

        <Button
            android:id="@+id/bnt8"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:onClick="onDigit"
            android:text="8"
            android:textSize="20sp" />

        <Button
            android:id="@+id/bnt9"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:onClick="onDigit"
            android:text="9"
            android:textSize="20sp" />
        <Button
            android:id="@+id/btnMul"
            android:layout_width="0dp"
            android:layout_weight="1"
            android:layout_height="match_parent"
            android:text="*"
            android:textSize="20sp"
            android:onClick="onOper"
            />
    </LinearLayout>
    <LinearLayout

        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"
        android:orientation="horizontal">

        <!--
         android:id="@+id/bntAC"        //atribuir sempre um id
         android:layout_weight="1"      //distribuir o espaço da mesma forma (é o peso)
         android:layout_width="0dp"     //por termos peso a largura tem que ter 0dp

         -->
        <Button
            android:id="@+id/bnt4"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:onClick="onDigit"
            android:text="4"
            android:textSize="20sp" />

        <Button
            android:id="@+id/bnt5"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:onClick="onDigit"
            android:text="5"
            android:textSize="20sp" />

        <Button
            android:id="@+id/bnt6"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:onClick="onDigit"
            android:text="6"
            android:textSize="20sp" />
        <Button
            android:id="@+id/bntSub"
            android:layout_width="0dp"
            android:layout_weight="1"
            android:layout_height="match_parent"
            android:text="-"
            android:textSize="20sp"
            android:onClick="onOper"
            />
    </LinearLayout>
    <LinearLayout

        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"
        android:orientation="horizontal">

        <!--
         android:id="@+id/bntAC"        //atribuir sempre um id
         android:layout_weight="1"      //distribuir o espaço da mesma forma (é o peso)
         android:layout_width="0dp"     //por termos peso a largura tem que ter 0dp

         -->
        <Button
            android:id="@+id/bnt1"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:onClick="onDigit"
            android:text="1"
            android:textSize="20sp" />

        <Button
            android:id="@+id/bnt2"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:onClick="onDigit"
            android:text="2"
            android:textSize="20sp" />

        <Button
            android:id="@+id/bnt3"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:onClick="onDigit"
            android:text="3"
            android:textSize="20sp"
            />
        <Button
            android:id="@+id/bntMais"
            android:layout_width="0dp"
            android:layout_weight="1"
            android:layout_height="match_parent"
            android:text="+"
            android:textSize="20sp"
            android:onClick="onOper"
            />
    </LinearLayout>
    <LinearLayout

        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"
        android:orientation="horizontal">

        <!--
         android:id="@+id/bntAC"        //atribuir sempre um id
         android:layout_weight="1"      //distribuir o espaço da mesma forma (é o peso)
         android:layout_width="0dp"     //por termos peso a largura tem que ter 0dp

         -->
        <Button
            android:id="@+id/bnt0"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="2"
            android:onClick="onDigit"
            android:text="0"
            android:textSize="20sp" />

        <Button
            android:id="@+id/bntPonto"
            android:layout_width="0dp"
            android:layout_weight="1"
            android:layout_height="match_parent"
            android:text="."
            android:textSize="20sp"
            android:onClick="onPonto"
            />
        <Button
            android:id="@+id/bntIgual"
            android:layout_width="0dp"
            android:layout_weight="1"
            android:layout_height="match_parent"
            android:text="="
            android:textSize="20sp"
            android:onClick="onIgual"
            />
    </LinearLayout>
</LinearLayout>
Tags : , , , , ,