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