2009-09-01 30 views
5

Sto cercando di insegnare a me stesso come scrivere app Android e ho difficoltà a registrare un clic del pulsante e ad eseguire azioni in base al pulsante di opzione selezionato al momento . Questo è un semplice calcolatore di punte:Android: registrazione pulsante e azione sulla base della selezione 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); 
       } 
      } 
     } 
} 

Tutto va bene, ma non succede nulla quando premo il pulsante calcola nel telefono virtuale.

risposta

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

Il tuo problema è che non aggiungi mai istanze di EditText al layout corrente.

È necessario aggiungerli come figli del layout principale.

+0

vuoi dire cambiarla a questo? EditText bill = (EditText) findViewById (R.id.conto); EditText resulttotal = (EditText) findViewById (R.id.resulttotal); – MaQleod

+0

Questo è un problema, ma è ** NON ** IL problema. –

+0

quali detrazioni sono causate aggiungendole al layout corrente anziché come bambini? – MaQleod

11

Il problema è dove si sta confrontando le RadioGroup 's id selezionati ... ti consigliamo di cambiare la vostra onClick() a:

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() dà sarà il R.id per la vista e non solo un numero che ti dice quale è in sequenza.

Pochi rapidi (indipendenti) suggerimenti:

  • Utilizzare un'istruzione switch al posto di un mazzo di se-dichiarazioni.
  • Mettere qualcosa in là per controllare per -1 (niente controllato) anche ... solo per essere sicuro.
  • In onClick() di solito controllo per quale vista è stato fatto clic controllando l'id della vista in entrata. Questo lo rende dove non devi tenere tutto archiviato e (IMHO) è un po 'più chiaro di cosa stai parlando.

I suggerimenti di cui sopra sarebbe un aspetto simile:

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; 
     } 
    } 
} 

Infine, se tutto quello che stai facendo in onCheckedChanged() è la memorizzazione del valore si potrebbe sbarazzarsi di tutto insieme e basta controllare per essa in onClick(). Qualcosa di simile:

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

non collegati, ma un altro problema che ho notato (e qualcun altro detto) ... Se il EditText s sono elencati nel layout XML allora avresti bisogno di ottenere ganci per loro come questo (e non crearne di nuovi):

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

Inoltre, probabilmente si potrebbe semplicemente utilizzare un TextView invece di un EditView per il risultato se yo udon't bisogno di essere modificabile.

+0

ha deciso di non andare con una dichiarazione switch in quanto ci sono solo 3 opzioni e non sembra necessario, anche se sarebbe più pulito. Controllo un pulsante di opzione nel documento xml, quindi non ci dovrebbe essere alcun modo per non averne uno controllato, ma suppongo che sia meglio prevenire che curare. La soluzione che ho trovato (pubblicata di seguito) ha a che fare con il modo in cui ho gestito l'onclicklistener. – MaQleod

+0

Sì, l'interruttore è una specie di preferenza personale. Sembra che anche la tua soluzione dovrebbe funzionare. –

1

Ho qualche problema simile. Ho un conto alla rovescia in un'attività di gruppo radio. Quando l'utente fa clic sul pulsante successivo, il gruppo radio viene controllato per verificare se è selezionata un'opzione. Ho implementato il pulsante premuto alla fine del conto alla rovescia, ora ho bisogno di passare un ID radio controllato per bypassare il messaggio utente predefinito di un'opzione non selezionata.

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; 

      } 
Problemi correlati