quinta-feira, 1 de dezembro de 2011

Android - Calculadora - programa com código fonte

Olá,

O projeto a seguir é um exemplo muito simples de uma calculadora apenas para fins didáticos, este projeto eu irei utilizar em um Curso de Extensão que irei ministrar em 2012 na Universidade de Franca - UniFran.

Nele serão abordados alguns pontos interessantes para iniciantes abaixo segue uma lista deles:

  • Layout landscape e portrait 
  • Evento click para botões
  • Tratamento de erro
  • Conversão de valores (String para Double)

Abaixo segue o fonte do arquivo CalculadoraActivity.java o fonte está todo comentado para melhor entendimento.

package br.com.CursoExt;

import java.text.NumberFormat;

import br.com.CursoExt.R.id;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.os.Message;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

public class CalculadoraActivity extends Activity implements OnClickListener {
    
  
 // Definição dos objetos e variáveis modulares que 
 // serão utilizados dentro da classe
 
    EditText primeiro;
    EditText segundo;
    EditText resultado;
    Button btnSomar;
    Button btnSubtrair;
    Button btnMultiplicar;
    Button btnDividir;
    Double result = (double)0; 

    // Chamada quando a activity é criada pela primeira vez
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //
         // Associa um arquivo de layout a esta classe
         //
        setContentView(R.layout.main);
        
        try{
            // 
            // Instanciando os objetos de acordo com o layout XML 
            // definido no arquivo main.xml
            //
            primeiro = (EditText)findViewById(R.id.edNumero1);
            segundo = (EditText)findViewById(R.id.edNumero2);
            resultado = (EditText)findViewById(R.id.edResultado);
            btnSomar = (Button)findViewById(id.btnSomar);
            btnSubtrair = (Button)findViewById(id.btnSubtrair);
            btnMultiplicar = (Button)findViewById(id.btnMultiplicar);
            btnDividir = (Button)findViewById(id.btnDividir);
         
            // 
            // Associando o evento OnClickListener de cada um dos botões 
            // a uma fução específica
            //
            btnSomar.setOnClickListener(onClick_btnSomar);
            btnSubtrair.setOnClickListener(onClick_btnSubtrair);
            btnMultiplicar.setOnClickListener(onClick_btnMultiplicar);
            btnDividir.setOnClickListener(onClick_btnDividir);
        }
        catch (Exception e) {
            // Tratamento de erro 
            Mensagem(e.getMessage());
        }
    }

    // Cria um anonymous implementation para OnClickListener 
    OnClickListener onClick_btnSomar = new OnClickListener() {    
        public void onClick(View v) {
            try
            {
                result = getDouble(primeiro.getText().toString()) + getDouble(segundo.getText().toString());
                MostraResultado();
                Mensagem("onClick_btnSomar");
                //Gravar no LogCat uma informação para auxiliar 
                //no processo de desenvolvimento e correção de bugs
                Log.i("Somar", "clicou no botão Somar");
            }
            catch (Exception e) {
                //Gravar no LogCat o erro ocorrido
                TrataErro(e, "Botão Somar");
            }
        }
    };    

    OnClickListener onClick_btnSubtrair = new OnClickListener() {    
        public void onClick(View v){      
            try
            {
                result = Double.valueOf(primeiro.getText().toString()) - Double.valueOf(segundo.getText().toString());
                MostraResultado();
                Mensagem("onClick_btnSubtrair");
            }
            catch (Exception e) {
                TrataErro(e, "Botão Subtrair");
            }
        }
    };

    OnClickListener onClick_btnMultiplicar = new OnClickListener() {    
        public void onClick(View v) {      
            try
            {
                result = Double.valueOf(primeiro.getText().toString()) * Double.valueOf(segundo.getText().toString());
                MostraResultado();
                Mensagem("onClick_btnMultiplicar");
            }
            catch (Exception e) {
                TrataErro(e, "Botão Multiplicar");
            }
        }
    };    

    OnClickListener onClick_btnDividir = new OnClickListener() {    
     public void onClick(View v) { 
            try
            {
                result = Double.valueOf(primeiro.getText().toString()) / Double.valueOf(segundo.getText().toString());
                MostraResultado();
                Mensagem("onClick_btnDividir");
            }
            catch (Exception e) {
                TrataErro(e, "Botão Dividir");
            }
        }
    };    
    
    //
    // Desativando o botão voltar do aparelho
    //
    @Override
    public void onBackPressed() {
        return;
    }
 
    public void onClick_Sair(View v) {
        try
        {
            //
            // Criando uma caixa de diálogo para sair ou não do sistema
            //
            AlertDialog.Builder builder = new AlertDialog.Builder(this);     
            builder.setMessage("Você tem certeza que deseja sair?")            
                //informando o título da caixa de texto
                .setTitle("Atenção:")
                .setIcon(android.R.drawable.ic_menu_info_details) 
       
                //setCancelable = false
                //desabilita o botão Voltar com isso obrigando o usuário 
                //a selecionar um dos botões do AlertDialog
                .setCancelable(false)      
                .setPositiveButton("Sim", new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int id) {
                        CalculadoraActivity.this.finish();
                    }            
                })           
                .setNegativeButton("Não", new DialogInterface.OnClickListener() { 
                    public void onClick(DialogInterface dialog, int id) { 
                        dialog.cancel();                
                    }            
                });     
            AlertDialog alert = builder.create();     
            alert.show();  
        }
        catch (Exception e) {
            Mensagem(e.getMessage());
        }
    }

    // 
    // Apresentar o resultado do cálculo no objeto "resultado"
    // através do método setText
    //
    private void MostraResultado()
    {
        String strResult = NumberFormat.getInstance().format(result);
        resultado.setText(strResult);
    }
 
    // 
    // Converter um valor String para Double
    // 
    private Double getDouble(String pValue)
    {
        if (pValue == null || pValue.length() == 0 || pValue.equals("."))
            return Double.valueOf(0);
        else
            return Double.parseDouble(pValue);
    }
 
    // 
    // Apresentar mensagem de erro ou informações oa usuário
    // 
    private void Mensagem(String pMens)
    {
        Toast.makeText(this, pMens, Toast.LENGTH_SHORT).show();
    }

    private void TrataErro(Exception e, String pMens)
    {
        Mensagem(e.getMessage());
        Log.e(getString(R.string.app_name), pMens, e);
    }
}

Foram criados dois layout um para o landscape e outro para o portrait, abaixo segue o layout portrait:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 
    android:layout_height="fill_parent" 
    android:layout_width="fill_parent" 
    android:orientation="vertical" 
    xmlns:android="http://schemas.android.com/apk/res/android">

    <TextView 
        android:layout_height="wrap_content" 
        android:layout_width="fill_parent" 
        android:text="Digite o primeiro número"/>

    <EditText 
        android:id="@+id/edNumero1" 
        android:inputType="numberDecimal" 
        android:layout_height="wrap_content" 
        android:layout_width="match_parent" 
        android:text="0"/>

    <TextView 
        android:layout_height="wrap_content" 
        android:layout_width="fill_parent" 
        android:text="Digite o segundo número"/>
        
    <EditText 
        android:id="@+id/edNumero2" 
        android:inputType="numberDecimal" 
        android:layout_height="wrap_content" 
        android:layout_width="match_parent" 
        android:text="0"/>
    
    <TextView 
        android:layout_height="wrap_content" 
        android:layout_width="fill_parent" 
        android:text="Operações:"/>
    
    <Button 
        android:id="@+id/btnSomar" 
        android:layout_height="wrap_content" 
        android:layout_width="wrap_content" 
        android:text="Somar"/>

    <Button 
        android:id="@+id/btnSubtrair" 
        android:layout_height="wrap_content" 
        android:layout_width="wrap_content" 
        android:text="Subtrair"/>

    <Button 
        android:id="@+id/btnDividir" 
        android:layout_height="wrap_content" 
        android:layout_width="wrap_content" 
        android:text="Dividir"/>

    <Button 
        android:id="@+id/btnMultiplicar" 
        android:layout_height="wrap_content" 
        android:layout_width="wrap_content" 
        android:text="Multiplicar"/>
    
    <TextView 
        android:layout_height="wrap_content" 
        android:layout_width="fill_parent" 
        android:text="Resultado:"/>
    
    <EditText 
        android:id="@+id/edResultado" 
        android:inputType="numberDecimal" 
        android:layout_height="wrap_content" 
        android:layout_width="match_parent"/>

</LinearLayout>

E a seguir o layout landscape:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 
    android:layout_height="fill_parent" 
    android:layout_width="fill_parent" 
    android:orientation="vertical" 
    xmlns:android="http://schemas.android.com/apk/res/android">

    <TextView 
        android:layout_height="wrap_content" 
        android:layout_width="fill_parent" 
        android:text="Digite o primeiro número"/>

    <EditText 
        android:id="@+id/edNumero1" 
        android:inputType="numberDecimal" 
        android:layout_height="wrap_content" 
        android:layout_width="match_parent" 
        android:text="0"/>

    <TextView 
        android:layout_height="wrap_content" 
        android:layout_width="fill_parent" 
        android:text="Digite o segundo número"/>
        
    <EditText 
        android:id="@+id/edNumero2" 
        android:inputType="numberDecimal" 
        android:layout_height="wrap_content" 
        android:layout_width="match_parent" 
        android:text="0"/>
    
    <TextView 
        android:layout_height="wrap_content" 
        android:layout_width="fill_parent" 
        android:text="Operações:"/>

    <LinearLayout 
        android:layout_height="wrap_content" 
        android:layout_width="fill_parent" 
        android:orientation="horizontal">    
    
        <Button 
            android:id="@+id/btnSomar" 
            android:layout_height="wrap_content" 
            android:layout_width="wrap_content" 
            android:text="Somar"/>

        <Button 
            android:id="@+id/btnSubtrair" 
            android:layout_height="wrap_content" 
            android:layout_width="wrap_content" 
            android:text="Subtrair"/>

        <Button 
            android:id="@+id/btnDividir" 
            android:layout_height="wrap_content" 
            android:layout_width="wrap_content" 
            android:text="Dividir"/>

        <Button 
            android:id="@+id/btnMultiplicar" 
            android:layout_height="wrap_content" 
            android:layout_width="wrap_content" 
            android:text="Multiplicar"/>
    
    </LinearLayout>

    <TextView 
        android:layout_height="wrap_content" 
        android:layout_width="fill_parent" 
        android:text="Resultado:"/>
    
    <EditText 
        android:id="@+id/edResultado" 
        android:inputType="numberDecimal" 
        android:layout_height="wrap_content" 
        android:layout_width="match_parent"/>
        
</LinearLayout>

Para criação dos dois layouts será necessário criar uma pasta chamada layout-land dentro da pasta res, conforme figura abaixo:


Abaixo segue um print de como ficou nossa calculadora:


Repare a diferença de layout nos botões entre as duas visões graças a inclusão dos dois arquivos main.xml, ou seja, um para cada layout.

Por enquanto é isso, é um projeto bem simples, mas que acredito que servirá para muitos no aprendizado.


Desenv com qualidade!

8 comentários:

Anônimo disse...

Obrigado por disponibilizar o codigo, estava procurando um codigo fonte para aprender como funciona e com esse seu projeto me ajdará muito.

OCONTESTADOR disse...

ótimo conteúdo ira me ajudar muito ,para desenvolver meu 1 aplicativo para android...valeu por compartilhar o seu conhecimento!!!

Dri Garcia disse...

Muito bom. Vlw!!!

Unknown disse...

OLA TA BOM MAIS ACHO Q ESSE CODIGO FICOU MUITO GRANDE OLHA ESSE AKI =>>


import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.view.View;
import android.widget.*;
import android.view.*;

public class Main extends Activity {

EditText etNum1,etNum2,etResultado;
double num1, num2, resultado;
Button btSoma, btDividir, btDiminuir,btMultiplicar;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
etNum1 = (EditText) findViewById(R.id.calculo_numero1);
etNum2 = (EditText) findViewById(R.id.calculo_numero2);
etResultado = (EditText) findViewById(R.id.calculo_resultado);
btSoma = (Button) findViewById(R.id.idbotao_btSoma);
btDividir = (Button) findViewById(R.id.idbotao_btDividir);
btDiminuir = (Button) findViewById(R.id.idbotao_btDiminuir);
btMultiplicar = (Button) findViewById(R.id.idbotao_btMultiplicar);


btSoma.setOnClickListener(new View.OnClickListener() {

@Override
public void onClick(View arg0) {
num1 = Double.parseDouble(etNum1.getText() .toString());
num2 = Double.parseDouble(etNum2.getText() .toString());
resultado = num1 + num2;
etResultado.setText(String.valueOf(resultado));

}
});

btDiminuir.setOnClickListener(new View.OnClickListener() {

@Override
public void onClick(View arg0) {
num1 = Double.parseDouble(etNum1.getText() .toString());
num2 = Double.parseDouble(etNum2.getText() .toString());
resultado = num1 - num2;
etResultado.setText(String.valueOf(resultado));

}
});

btDividir.setOnClickListener(new View.OnClickListener() {

@Override
public void onClick(View arg0) {
num1 = Double.parseDouble(etNum1.getText() .toString());
num2 = Double.parseDouble(etNum2.getText() .toString());
resultado = num1 / num2;
etResultado.setText(String.valueOf(resultado));

}
});

btMultiplicar.setOnClickListener(new View.OnClickListener() {

@Override
public void onClick(View arg0) {
num1 = Double.parseDouble(etNum1.getText() .toString());
num2 = Double.parseDouble(etNum2.getText() .toString());
resultado = num1 * num2;
etResultado.setText(String.valueOf(resultado));

}
} );




}

}


Brainstorm disse...

Será que poderia me mandar o arquivo do programa? pois quando faço o meu aparece um monte de ponto de exclamação.

Unknown disse...
Este comentário foi removido pelo autor.
Unknown disse...

(Button) findViewById(id.btnDividir);


a mim esta a dar erro dis que n encontra o btnDividir nem o somar nem o subtrair nem o multiplicar
ajuda??

Unknown disse...

Boa tarde meu caro, estou começando agora e estou com duvida, meu eclipse aparece as pastas diferente do print que vc tirou, vc instalou algum plug diferente?