2009-09-01 9 views
5

Próbuję nauczyć się pisać aplikacje na Androida i mam problem z rejestracją kliknięcia przycisku i podejmowaniem działań, w oparciu o które zostanie wybrany przycisk radiowy w danym momencie . To jest prosty kalkulator napiwków:Android - kliknij przycisk rejestru i podejmij działania w oparciu o wybór radia

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

Wszystko ładuje się dobrze, ale nic się nie dzieje po naciśnięciu przycisku kalkulowania w telefonie wirtualnym.

Odpowiedz

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

Twój problem polega na tym, że nigdy nie dodajesz instancji EditText do bieżącego układu.

Powinieneś dodać je jako dzieci głównego układu.

+0

masz na myśli zmieniając go do tego? EditText bill = (EditText) findViewById (R.id.rachunek); EditText resulttotal = (EditText) findViewById (R.id.resulttotal); – MaQleod

+0

To jest problem, ale to nie jest ** problem. –

+0

jakie szkody są powodowane przez dodanie ich do bieżącego układu zamiast jako dzieci? – MaQleod

11

Problemem jest to, gdzie jesteś porównując RadioGroup „s wybrane id ... będziesz chciał zmienić onClick() w celu:

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() daje ty będziesz R.id dla widok, a nie tylko liczba, która mówi, która jest w kolejności.

Kilka szybkich (niepowiązanych) propozycje:

  • pomocą instrukcji switch zamiast pęczek if-stwierdzeń.
  • Umieść coś tam, aby sprawdzić -1 (nic nie zaznaczone) zbyt ... tylko, aby mieć pewność.
  • W onClick() zazwyczaj sprawdzam, który widok został kliknięty, sprawdzając identyfikator widoku przychodzącego. To sprawia, że ​​nie musisz przechowywać wszystkiego i (IMHO) jest trochę bardziej zrozumiałe o czym mówisz.

Powyższe sugestie będą wyglądać tak:

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

Wreszcie, jeśli wszystko co robisz w onCheckedChanged() zapisuje wartość można pozbyć się tego wszystkiego razem i po prostu sprawdzić na nim w onClick(). Coś jak:

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

niezwiązane, ale inny problem zauważyłem (i ktoś wspomniał) ... jeśli EditText s wymienione są w układzie XML wtedy trzeba by dostać haki do nich tak (i nie twórz nowych):

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

Ponadto, można prawdopodobnie wystarczy użyć TextView zamiast EditView dla wyniku, jeśli yo udon't potrzebują być edytowalne.

+0

postanowił nie używać instrukcji switch, ponieważ są tylko 3 opcje i nie wydaje się konieczne, chociaż byłoby czystsze. Sprawdzam przycisk radiowy w dokumencie xml, więc naprawdę nie powinno być żadnego sposobu, aby go nie sprawdzić, ale przypuszczam, że jest to bezpieczniejsze niż przykro. Rozwiązanie, które znalazłem (zamieszczone poniżej) miało związek z tym, jak sobie poradziłem z onclicklistener. – MaQleod

+0

Ta zmiana jest rodzajem osobistej preferencji. Wygląda na to, że twoje rozwiązanie też powinno działać. –

1

Mam podobny problem. Mam odliczanie w działalności grupy radiowej. Gdy użytkownik kliknie następny przycisk, grupa radiowa jest sprawdzana, aby sprawdzić, czy wybrana jest opcja. Zaimplementowałem przycisk wciśnięty na końcu odliczania, teraz muszę przekazać sprawdzony identyfikator radia, aby pominąć domyślny komunikat użytkownika dla opcji niewybranej.

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

      } 
Powiązane problemy