2009-09-01 6 views
5

Ich versuche, mich selbst zu lehren, wie Android-Apps zu schreiben und ich habe Probleme beim Registrieren einer Schaltfläche Klicken und Ausführen von Aktionen basierend auf welche Optionsfeld ausgewählt ist zu der Zeit . Dies ist ein einfacher Tipp Rechner:Android - Register-Taste klicken und Maßnahmen ergreifen basierend auf Radio-Auswahl

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

Alles lädt gut, aber nichts passiert, wenn ich die Schaltfläche Berechnen im virtuellen Telefon drücken.

Antwort

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

Ihr Problem besteht darin, dass Sie dem aktuellen Layout keine EditText-Instanzen hinzufügen.

Sie sollten sie als untergeordnete Elemente des Hauptlayouts hinzufügen.

+0

Sie es dazu bedeuten verändern? EditText bill = (EditText) findViewById (R.id.Rechnung); EditText resulttotal = (BearbeitenText) findViewById (R.id.resulttotal); – MaQleod

+0

Das ist ein Problem, aber es ist ** NICHT ** das Problem. –

+0

Welche Nachteile entstehen, wenn Sie sie dem aktuellen Layout hinzufügen und nicht als Kinder? – MaQleod

11

Das Problem ist, wo Sie den Vergleich der RadioGroup ‚s ausgewählt id ... Sie wollen Ihre onClick ändern() zu:

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() gibt Ihnen die R.id sein wird, die Ansicht und nicht nur eine Zahl, die Ihnen sagt, um was es sich handelt.

Ein paar schnellen (nicht verwandten) Vorschläge:

  • eine switch-Anweisung anstelle ein Bündel von if-Anweisungen verwenden.
  • Geben Sie etwas ein, um nach -1 zu suchen (nichts überprüft), um sicher zu gehen.
  • Im onClick() überprüfe ich normalerweise, auf welche View geklickt wurde, indem ich die ID der eingehenden Ansicht überprüfe. Dies macht es nur dort, wo Sie nicht alles gespeichert haben müssen und (IMHO) ist ein wenig klarer, worüber Sie reden.

Die oben genannten Vorschläge würde in etwa so aussehen:

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

Schließlich, wenn alles, was Sie in onCheckedChanged() tun wird, um den Wert zu speichern Sie alle zusammen es loswerden könnte und prüfen nur für ihn in der onClick(). Etwas wie:

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

Unrelated, aber ein anderes Problem, das ich bemerkt (und jemand anderes erwähnt) ... wenn Ihr EditText s im XML-Layout aufgelistet werden, dann würden Sie brauchen Haken, um sie so zu erhalten (und erstellen Sie keine neue):

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

auch könnte man wahrscheinlich nur eine TextView anstelle eines EditView für das Ergebnis verwenden, wenn yo udon't es editierbar sein müssen.

+0

entschieden, nicht mit einer switch-Anweisung zu gehen, da es nur 3 Optionen gibt und es scheint nicht notwendig, obwohl es sauberer wäre. Ich überprüfe einen Radioknopf im XML-Dokument, also sollte es wirklich keinen Weg geben, einen nicht zu überprüfen, aber ich denke besser als Nachsicht. Die Lösung, die ich gefunden habe (siehe unten), hatte damit zu tun, wie ich den onclicklistener gehandhabt habe. – MaQleod

+0

Ja, der Schalter ist eine persönliche Vorliebe Sache. Sieht so aus, als ob deine Lösung auch funktionieren sollte. –

1

Ich habe ein ähnliches Problem. Ich habe einen Countdown in einer Radiogruppenaktivität. Wenn der Benutzer auf die nächste Schaltfläche klickt, wird die Radiogruppe überprüft, um festzustellen, ob eine Option ausgewählt ist. Ich habe die Taste am Ende des Countdowns gedrückt, jetzt muss ich eine überprüfte Radio-ID übergeben, um die Standardbenutzernachricht einer nicht ausgewählten Option zu umgehen.

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

      } 
Verwandte Themen