2009-09-01 22 views
5

Estoy tratando de enseñarme cómo escribir aplicaciones de Android y tengo problemas para registrar un clic de botón y tomar acciones según el botón de opción seleccionado en ese momento . Esta es una calculadora de propinas simple:Android - botón de registro haga clic y tome medidas en función de la selección de radio

import android.app.Activity; 
import android.os.Bundle; 
import android.widget.Button; 
import android.widget.EditText; 
import android.widget.RadioButton; 
import android.widget.TextView; 
import android.widget.RadioGroup; 
import android.view.View; 

public class TipCalc extends Activity implements RadioGroup.OnCheckedChangeListener,View.OnClickListener 
{ 
    TextView result; 
    RadioGroup radiogroup1; 
    RadioButton r1,r2,r3; 
    Button calculate; 
    EditText bill, resulttotal; 
    private int radioCheckedId = -1; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     radiogroup1 = (RadioGroup) findViewById(R.id.radiogroup1); 
     Button calculate = (Button) findViewById(R.id.calculate); 
     RadioButton r1 = (RadioButton) findViewById(R.id.poor); 
     RadioButton r2 = (RadioButton) findViewById(R.id.average); 
     RadioButton r3 = (RadioButton) findViewById(R.id.excellent); 
     EditText bill = new EditText(this); 
     EditText resulttotal = new EditText(this); 
     radiogroup1.setOnCheckedChangeListener(this); 
     calculate.setOnClickListener(this); 
     //bill.setText("0"); 
     //resulttotal.setText("0"); 
    } 

    public void onCheckedChanged(RadioGroup group, int checkedId) { 
     radioCheckedId = checkedId; 
    } 

    public void onClick(View v) 
     { 
      if (v == calculate) 
      { 
       String billtotal; 
       double total = 0; 
       billtotal = bill.getText().toString(); 
       final int aInt = Integer.parseInt(billtotal); 
       if (radioCheckedId == 1) 
       { 
        total = aInt * 1.1; 
        final String aString = Double.toString(total); 
        resulttotal.setText(aString); 
       } 
       if (radioCheckedId == 2) 
       { 
        total = aInt * 1.15; 
        final String aString = Double.toString(total); 
        resulttotal.setText(aString); 
       } 
       if (radioCheckedId == 3) 
       { 
        total = aInt * 1.2; 
        final String aString = Double.toString(total); 
        resulttotal.setText(aString); 
       } 
      } 
     } 
} 

Todo carga bien, pero no ocurre nada cuando presiono el botón calcular en el teléfono virtual.

Respuesta

5
import java.text.NumberFormat; 
import java.util.Locale; 
import android.app.Activity; 
import android.os.Bundle; 
import android.widget.Button; 
import android.widget.EditText; 
import android.widget.RadioButton; 
import android.widget.TextView; 
import android.widget.RadioGroup; 
import android.view.View; 

public class TipCalc extends Activity 
{ 
    TextView result; 
    RadioGroup radiogroup1; 
    RadioButton r1,r2,r3; 
    Button calculate; 
    EditText bill, resulttotal; 
    Locale currentLocale = Locale.getDefault(); 

    @Override 
    protected void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     radiogroup1 = (RadioGroup) findViewById(R.id.radiogroup1); 
     final Button calculate = (Button) findViewById(R.id.calculate); 
     final RadioButton r1 = (RadioButton) findViewById(R.id.poor); 
     final RadioButton r2 = (RadioButton) findViewById(R.id.average); 
     final RadioButton r3 = (RadioButton) findViewById(R.id.excellent); 
     final EditText bill = (EditText) findViewById(R.id.bill); 
     final EditText tiptotal = (EditText) findViewById(R.id.tiptotal); 
     final EditText resulttotal = (EditText) findViewById(R.id.resulttotal); 
     bill.setText("0.00"); 
     tiptotal.setText("0.00"); 
     resulttotal.setText("0.00"); 
     calculate.setOnClickListener(new View.OnClickListener() { 
      public void onClick(View v) throws NumberFormatException { 
       if (v == calculate) 
       { 
       NumberFormat currencyFormatter; 
       currencyFormatter = NumberFormat.getCurrencyInstance(currentLocale); 
       double atotal = 0; 
        double btotal = 0; 
        String billtotal = bill.getText().toString(); 
        Double aDbl = 0.00; 
        try 
        { 
         aDbl = Double.parseDouble(billtotal); 
        } 
        catch(NumberFormatException n) 
        { 
         aDbl = 0.00; 
        } 
        if (r1.isChecked()) 
        { 
         atotal = aDbl * 1.1; 
         btotal = aDbl * 0.1; 
        } 
        if (r2.isChecked()) 
        { 
         atotal = aDbl * 1.15; 
         btotal = aDbl * 0.15; 
        } 
        if (r3.isChecked()) 
        { 
         atotal = aDbl * 1.2; 
         btotal = aDbl * 0.2; 
        } 
        final String bString = currencyFormatter.format(btotal); 
        tiptotal.setText(bString); 
        final String aString = currencyFormatter.format(atotal); 
        resulttotal.setText(aString); 
       } 
      } 
     }); 

    } 
} 
0

Su problema es que nunca agrega instancias de EditText al diseño actual.

Debe agregarlos como elementos secundarios del diseño principal.

+0

usted se refiere a cambiar a esto? EditText bill = (EditText) findViewById (R.id.cuenta); EditText resulttotal = (EditText) findViewById (R.id.resulttotal); – MaQleod

+0

Eso es un problema, pero es ** NO ** EL problema. –

+0

¿qué daños se producen al agregarlos al diseño actual en lugar de como elementos secundarios? – MaQleod

11

El problema es donde se está comparando los RadioGroup 's Identificación seleccionados ... que querrá cambiar su onClick() para:

public void onClick(View v) { 
    if (v == calculate) { 
     String billtotal; 
     double total = 0; 
     billtotal = bill.getText().toString(); 
     final int aInt = Integer.parseInt(billtotal); 
     if (radioCheckedId == R.id.poor) { 
      total = aInt * 1.1; 
      final String aString = Double.toString(total); 
      resulttotal.setText(aString); 
     } 
     if (radioCheckedId == R.id.average) { 
      total = aInt * 1.15; 
      final String aString = Double.toString(total); 
      resulttotal.setText(aString); 
     } 
     if (radioCheckedId == R.id.excellent) { 
      total = aInt * 1.2; 
      final String aString = Double.toString(total); 
      resulttotal.setText(aString); 
     } 
    } 
}  

onCheckedChanged() da usted será el R.id de la vista y no solo un número que te dice cuál es en secuencia.

unos pocos (no relacionadas) sugerencias rápidas:

  • Utilice una sentencia switch en lugar de un montón de instrucciones IF.
  • Pon algo allí para verificar -1 (nada marcado) también ... solo para estar seguro.
  • En onClick() Normalmente comprobé para qué Vista se hizo clic marcando la identificación de la vista entrante. Esto simplemente lo hace donde no tienes que guardar todo almacenado y (en mi humilde opinión) es un poco más claro de lo que estás hablando.

Las sugerencias anteriores se vería algo como:

public void onClick(View v) { 
    if (v.getId() == R.id.calculate) { 
     String billtotal; 
     double total = 0; 
     billtotal = bill.getText().toString(); 
     final int aInt = Integer.parseInt(billtotal); 
     switch(radioCheckedId) { 
      case R.id.poor: 
       total = aInt * 1.1; 
       final String aString = Double.toString(total); 
       resulttotal.setText(aString); 
       break; 
      case R.id.average: 
       total = aInt * 1.15; 
       final String aString = Double.toString(total); 
       resulttotal.setText(aString); 
       break; 
      case R.id.excellent: 
       total = aInt * 1.2; 
       final String aString = Double.toString(total); 
       resulttotal.setText(aString); 
       break; 
      default: 
       // do something for when nothing is selected... maybe throw an error? 
       break; 
     } 
    } 
} 

Por último, si todo lo que está haciendo en OnCheckedChanged() es el almacenamiento del valor que podría deshacerse de él todos juntos y simplemente comprobar si se en el onClick(). Algo así como:

public void onClick(View v) { 
    int radioCheckedId = radiogroup1.getCheckedRadioButtonId(); 
    if (v == calculate) { 
     // ... 

no relacionados, pero otro problema me di cuenta (y alguien más ha dicho) ... si sus EditText s se enumeran en el diseño de XML a continuación, que había necesidad de conseguir ganchos a ellos de esta manera (y no crear otros nuevos):

EditText bill  = (EditText) findViewById(R.id.bill  ); 
EditText resulttotal = (EditText) findViewById(R.id.resulttotal); 

Además, probablemente podría simplemente utilizar un TextView en lugar de un EditView para el resultado si yo udon't que tiene que ser editable.

+0

decidió no ir con una declaración de cambio ya que solo hay 3 opciones y no parece necesario, aunque sería más limpio. Compruebo un botón de radio en el documento xml, así que realmente no debería haber ninguna manera de que no se revise uno, pero supongo que es mejor prevenir que curar. La solución que encontré (publicada a continuación) tenía que ver con la forma en que manejaba el onclicklistener. – MaQleod

+0

Sí, el cambio es una especie de preferencia personal. Parece que tu solución debería funcionar también. –

1

que tienen algún problema similar. Tengo una cuenta atrás en una actividad de grupo de radio. Cuando el usuario hace clic en el siguiente botón, el grupo de radio se verifica para ver si se selecciona una opción. Implementé el botón presionado al final de la cuenta regresiva, ahora necesito pasar una identificación de la radio marcada para omitir el mensaje de usuario predeterminado de una opción no seleccionada.

caso R.id.next:

 Log.d(" ID BOTAO",((java.lang.String) String).valueOf(rGroup3.getCheckedRadioButtonId())); 

      if(rGroup3.getCheckedRadioButtonId()==-1){ 
       Context context = getApplicationContext(); 
       CharSequence text = "Please, select an option!";      
       int duration = Toast.LENGTH_SHORT; 
       Toast toast = Toast.makeText(context, text, duration); 
       toast.show(); 
       break; 

      } 
Cuestiones relacionadas