0

私のプログラムは現在、次のことを行っています。

  • ユーザーが値を入力します
  • ユーザーがコンバージョンを選択
  • ユーザーヒット送信

選択した変換に基づいて(ラジオボタンを使用)、変換の計算を実行するメソッドを呼び出す必要があります。このメソッドは、変換をケースに返しますが、doubleを返すため、問題が発生します。

package com.exercise_5;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.RadioButton;
import android.widget.RadioGroup;
import android.widget.TextView;

public class MainActivity extends Activity {

private String textValue;

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
}

// Method called when the convert button is clicked
public void convert(View view) {
    RadioGroup conRadioGroup = (RadioGroup) findViewById(R.id.conRadioGroup);
    EditText textValue = (EditText) findViewById(R.id.editText1);

    switch(conRadioGroup.getCheckedRadioButtonId()) {
    case R.id.radioCelsiusToFahrenheit:
// Call the convert method
        fahrenheitToCelsius();
//Return the converted variable

        break;

    case R.id.radioFahrenheitToCelsius:
        fahrenheitToCelsius();

        break;

    default:
       Log.e("Some class tag", "Invalid id was passed to conversion method doing celsius conversion.");
       return celsiusToFahrenheit();
       break; 
     }

}

public void fahrenheitToCelsius(Convert tempCelsius) { 

    double conCelsius = Double.parseDouble(textValue);

    //Calculate Celsius
    tempCelsius = ((conCelsius * 9) / 5) + 32; 
}

public double celsiusToFahrenheit(double tempInFahrenheit) {

    double conFahrenheit = Double.parseDouble(textValue);

    //Calculate Fahrenheit
    return ((conFahrenheit * 9) / 5) + 32;
}

public void clear(View view) {
    //Reset Appended Strings After Previous Run
    TextView fahrenheit_TV = (TextView) this.findViewById(R.id.textView1);
    TextView celsius_TV = (TextView) this.findViewById(R.id.textView3);

    fahrenheit_TV.setText("Fahrenheit: ");
    celsius_TV.setText("Celsius: ");

}

}

4

2 に答える 2

1

クウにとって、実際にはありません。二項演算の変数(加算、乗算、減算、加算、剰余)のいずれかがdoubleの場合、Javaは両方の値をdoubleとして扱うため、結果は

((conCelsius * 9)/ 5)+ 32

操作はダブルです。

実際の質問に答えるために、コードにはいくつかの問題があります。関連するラジオボタンを設定する正しい方法は、それらをラジオボタングループにグループ化することです(コードが与えられていないと思います)。例については、 http://www.mkyong.com/android/android-radio-buttons-example/を参照してください。

その後、ラジオボタンのIDでどのボタンが選択されたかを確認できます。

これは、コードの一般的なレイアウトです。

   @Override
   public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    radioTempConvGroup = (RadioGroup) findViewById(R.id.radioTempConvGroup);
    btnConvert = (Button) findViewById(R.id.btnConvert);

    btnConvert.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {

                // get selected radio button from radioGroup
            int selectedId = radioTempConvGroup.getCheckedRadioButtonId();

                    double convertedTemp = convert(selectedId);
                    //do other operations with convertedTemp like display 
        }

    });


  private double convertTemp(int selectedId) {
       //TODO get value from the textview that holds  the value
       double temperature = //INSERT code to get the value to convert
       switch(selectedId) {
       case  R.id.radioCelsius:
           return celsiusToFahrenheit(temperature);
           break;
       case R.id.radioFahrenheit:
           return fahrenheitTocelsius(temperature);
          break;
       default:
          Log.e("Some class tag", "Invalid id was passed to conversion method doing celsius conversion.");
          return celsiusToFahrenheit(temperature);
          break; 
        }
   }

   private double celsiusToFahrenheit(double tempInCelsius) {
      //TODO add actual conversion
   }

   private double fahrenheitToCelsius(double tempInFahrenheit) {
      //TODO add actual conversion
   }

コードにはいくつかの問題があります。

複数の命令ではなく1つの命令が実行されないようにするために、常にifおよび同様の構造で中括弧を使用してください。私が想定し

case R.id.radioButton1:
    if (checked)
        fahrenheit();

        //Append Strings
        fahrenheit_TV.append(" " +fahrenheit.conversion);

    break;

として意図されていた

case R.id.radioButton1:
    if (checked) {
        fahrenheit();

        //Append Strings
        fahrenheit_TV.append(" " +fahrenheit.conversion);
    }
    break;

ただし、ifの直後の命令のみがご使用のバージョンで実行されます。

プリミティブdoubleで十分な場合は、Doubleを使用しないでください。オブジェクトの作成とボックス化およびボックス化解除は、コストのかかる操作です。

  public static double fahrenheit(Double conversion) {

    Double conCelsius = Double.parseDouble(getCelsius);

    //Calculate Celsius
    return ((conCelsius * 9) / 5) + 32;
  }

する必要があります:

  public static double fahrenheit(double conversion) {

    double conCelsius = Double.parseDouble(getCelsius);

    //Calculate Celsius
    return ((conCelsius * 9) / 5) + 32;
  }

第三に、コード全体で一貫性を保つようにするか、Java規則を使用するようにしてください。これにより、他の人(および6か月後のあなた)がコードを読みやすくなります。1つのメソッド名は大文字で始まり、別のメソッド名は小文字で始まります。一部の変数は分離に_を使用し、他の変数はキャメルケースを使用します。

于 2012-09-08T10:50:04.687 に答える
1

あなたが得る問題は、あなたの操作が整数で行われているため(9を掛けて5で割る)、したがってコンパイラが微積分を作成している間にconCelsiusをintに変換しているためだと思います。代わりに次のようになります:

return ((conCelsius * 9.0) / 5.0) + 32; 
于 2012-09-07T17:10:10.673 に答える