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:
Obrigado por disponibilizar o codigo, estava procurando um codigo fonte para aprender como funciona e com esse seu projeto me ajdará muito.
ótimo conteúdo ira me ajudar muito ,para desenvolver meu 1 aplicativo para android...valeu por compartilhar o seu conhecimento!!!
Muito bom. Vlw!!!
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));
}
} );
}
}
Será que poderia me mandar o arquivo do programa? pois quando faço o meu aparece um monte de ponto de exclamação.
(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??
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?
Postar um comentário