2009-09-01 9 views
5

J'essaie de m'apprendre à écrire des applications Android et j'ai du mal à enregistrer un clic sur un bouton et à prendre des actions en fonction du bouton radio sélectionné à ce moment . Ceci est un calculateur de pourboire simple:Android - cliquez sur le bouton cliquez et agir en fonction de la sélection 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); 
       } 
      } 
     } 
} 

Tout se charge très bien, mais rien ne se passe lorsque j'appuie sur le bouton de calcul dans le téléphone virtuel.

Répondre

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

Votre problème est que vous n'ajoutez jamais d'instances EditText à la mise en page actuelle.

Vous devez les ajouter en tant qu'éléments de la mise en page principale.

+0

-vous dire changer à cela? EditText bill = (EditText) findViewById (R.id.facture); EditText resulttotal = (EditText) findViewById (R.id.résulttotal); – MaQleod

+0

C'est un problème, mais ce n'est pas ** le problème. –

+0

quels sont les inconvénients causés en les ajoutant à la mise en page actuelle au lieu d'enfants? – MaQleod

11

Le problème est où vous comparez les RadioGroup « s sélectionnés id ... vous voulez changer votre onClick() à:

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() vous donne serez le R.id pour la vue et pas seulement un nombre qui vous indique ce qu'il est dans l'ordre.

Quelques suggestions rapides (non liés):

  • Utilisez une instruction switch au lieu d'un tas de si-déclarations.
  • Mettez quelque chose là-bas pour vérifier -1 (rien vérifié) aussi ... juste pour être sûr.
  • Dans onClick(), je vérifie généralement pour quel clic on a cliqué sur View en vérifiant l'identifiant de la vue entrante. Cela fait juste là où vous n'avez pas à garder tout stocké et (à mon humble avis) est un peu plus clair de ce que vous parlez.

Les suggestions ci-dessus ressemblerait à quelque chose comme:

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

Enfin, si tout ce que vous faites dans onCheckedChanged() est le stockage de la valeur que vous pouvez vous débarrasser de tout cela ensemble et il suffit de cocher pour elle dans le onClick(). Quelque chose comme:

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

non apparentés, mais un autre problème que j'ai remarqué (et quelqu'un d'autre mentionné) ... si votre EditText s sont répertoriés dans la mise en page XML vous avais alors besoin d'obtenir des crochets pour eux comme cela (et ne pas créer de nouvelles):

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

en outre, vous pouvez probablement utiliser un TextView au lieu d'un EditView pour le résultat si yo udon't besoin d'être modifiable.

+0

décidé de ne pas aller avec une déclaration de commutateur car il n'y a que 3 options et cela ne semble pas nécessaire, même si ce serait plus propre. Je vérifie un bouton radio dans le document XML, donc il ne devrait vraiment pas y avoir de moyen de ne pas en avoir un vérifié, mais je suppose que mieux vaut prévenir que guérir. La solution que j'ai trouvée (posté ci-dessous) a à voir avec la façon dont j'ai géré le onclicklistener. – MaQleod

+0

Ouais, le commutateur est une sorte de préférence personnelle. On dirait que votre solution devrait fonctionner aussi. –

1

J'ai un problème similaire. J'ai un compte à rebours dans une activité de groupe radio. Lorsque l'utilisateur clique sur le bouton suivant, le groupe radio est vérifié pour voir si une option est sélectionnée. J'ai mis en place le bouton appuyé à la fin du compte à rebours, maintenant je dois passer un Id de radio cochée pour contourner le message utilisateur par défaut d'une option non sélectionnée.

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

      } 
Questions connexes