2009-09-01 14 views
5

アンドロイドアプリを書く方法を自分自身で教えようとしていますが、ボタンクリックの登録に問題があり、その時点で選択されているラジオボタンに基づいて。これは簡単なヒント計算機です:Android - 登録ボタンラジオの選択に基づいて行動を起こす

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

すべてがロードされますが、仮想電話機の計算ボタンを押しても何も起こりません。

答えて

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

問題は、現在のレイアウトにEditTextインスタンスを追加しないことです。

メインレイアウトの子として追加する必要があります。

+0

あなたはこれにそれを変更する意味ですか? EditText bill =(EditText)findViewById(R.id。ビル); EditText resulttotal =(EditText)findViewById(R.id.resulttotal); – MaQleod

+0

それは問題ですが、問題ではありません**。 –

+0

子供の代わりに現在のレイアウトに追加することで、どのような障害が発生しますか? – MaQleod

11

あなたがIDを選択RadioGroup年代を比較しているところに問題がある...あなたの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()あなたはR.idになります提供しますビューとそれが順番になっていることを示す数字だけではありません。

いくつかの簡単な(無関係)の提案:

  • ではなくif文の束のswitch文を使用します。
  • -1(何もチェックされていません)もチェックしてください。確かに。
  • onClick()では、通常、受信ビューのIDをチェックしてどのビューをクリックしたかを確認します。これはちょうどあなたが保存されたすべてを保持する必要はありません(IMHO)あなたが話していることをもう少し明確です。あなたは()onCheckedChangedでやっているすべて一緒に、あなたはそれをすべてを取り除くことができた値を記憶している場合、

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

    最後に、ちょうどそれをチェック:

上記の提案は、次のようになりますonClick()内にあります。ような何か:

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

無関係、私は気づいた(と他の誰かが言及した)別の問題...あなたのEditText sはXMLレイアウトにリストされている場合、あなたはこのような彼らにフックを取得する必要があるだろう(と)新しいものを作成していない:ヨーヨーudon'tが編集可能にするためにそれを必要とする場合

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

また、あなたはおそらくちょうど結果をEditViewの代わりにTextViewを使用することができます。

+0

は3つのオプションしかないのでスイッチステートメントには行かないことにしました。私はxmlドキュメントのラジオボタンをチェックするので、実際にはチェックされていない方法はないはずですが、私は残念ながらより安全だと思います。 私が見つけた解決策(以下に掲載)は、onclicklistenerの処理方法と関係がありました。 – MaQleod

+0

スイッチは個人的な好みのものです。あなたのソリューションもうまくいくように見えます。 –

1

私には同様の問題があります。私はラジオ・グループ活動のカウントダウンをしています。 ユーザが次のボタンをクリックすると、ラジオグループがチェックされ、オプションが選択されているかどうかが確認されます。 カウントダウンの最後に押されたボタンを実装しました。選択されていないオプションのデフォルトのユーザーメッセージをバイパスするために、チェックされたラジオIDを渡す必要があります。

場合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; 

      } 
関連する問題