0

我的程序现在执行以下操作:

  • 用户输入一个值
  • 用户选择转化
  • 用户点击提交

根据选择的转换(使用单选按钮),我需要调用一个方法来执行转换的计算,然后将转换返回到案例,但我遇到了问题,因为我返回的是双精度数。

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

我认为您遇到的问题是因为您的操作是使用整数(乘以 9 并除以 5)完成的,因此编译器在进行微积分时将 conCelsius 转换为 int,而不是应该是这样的:

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

对Kuu来说,实际上没有。如果二元运算(加法、乘法、减法、加法、余数)中的任何一个变量是双精度数,则 Java 将这两个值都视为双精度数,因此

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

您的代码有几个问题:

始终使用带有 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 之后的指令才会在您的版本中执行。

当原始双精度足够时,不要使用双精度。对象创建和装箱和拆箱是昂贵的操作。

  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 个月后的您)更容易阅读代码。一种方法名称以大写字母开头,另一种以小写字母开头。一些变量使用 _ 进行分隔,其他使用驼峰式。

于 2012-09-08T10:50:04.687 回答