2016-08-13 42 views
0

我想制作一个可在Farhenheit和摄氏温度之间转换的应用程序,并且还可以实现显示接下来的5个温度及其相应转换的下拉菜单(微调)。用于转换温度的Android应用程序正在崩溃

import android.app.Activity; 
import android.net.Uri; 
import android.os.Bundle; 
import android.view.View; 
import android.widget.AdapterView; 
import android.widget.ArrayAdapter; 
import android.widget.EditText; 
import android.widget.RadioButton; 
import android.widget.Button; 
import android.widget.Spinner; 


import java.text.DecimalFormat; 
import java.util.ArrayList; 
import java.util.List; 

public class MainActivity extends Activity implements View.OnClickListener { 

    private EditText temp; 
    private RadioButton toC; 
    private RadioButton toF; 
    private Button ConvertButton; 
    private Spinner nextTempsSpinner; 
    private String tempText; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     //Assigning the private Java variables to their XML counterparts 

     temp = (EditText) findViewById(R.id.editTemperature); //Text box where user enters temperature 
     toC = (RadioButton) findViewById(R.id.FtoC); //Radio Button user selects so that temperature will be interpreted as Fahrenheit and returned as Celsius 
     toF = (RadioButton) findViewById(R.id.CtoF); //Radio Button user selects so that temperature will be interpreted as Fahrenheit and returned as Celsius 
     ConvertButton = (Button) findViewById(R.id.GetConversion); //Button user will click to get the conversion 
     nextTempsSpinner = (Spinner) findViewById(R.id.spinMyTemps); //Spinner is the drop down menu where the next 5 conversions will appear 

     ConvertButton.setOnClickListener(this); 
    } 

    @Override 
    public void onClick(View v) { 
     Double temporary, answer, temporaryTemperature; 

     String goingFrom = null; //Adding these so that we can use these strings in the dropdown spinner 
     String goingTo = null; 

     double value = Double.valueOf(temp.getText().toString()); 
     if (toC.isChecked()) // If the radio button for converting from Fahrenheit to Celsius is selected this conversion will happen 
     { 
      value = UnitConverter.FahrenheitToCelsius(value); 
      goingFrom = "F"; 
      goingTo = "C"; 
     } else if (toF.isChecked()) // If the radio button for converting from Celsius to Fahrenheit is selected this conversion will happen 
     { 
      value = UnitConverter.CelsiusToFahrenheit(value); 
      goingFrom = "C"; 
      goingTo = "F"; 
     } 
     temp.setText(Double.valueOf(value).toString()); 

     DecimalFormat twoDecimalFormat = new DecimalFormat("#.##"); 


     temporaryTemperature = Double.parseDouble(String.valueOf(temp)); 

     //Creating ArrayAdapter 

     List<String> listOfTemps = new ArrayList<String>(); 
     ArrayAdapter getTempAdapter = new ArrayAdapter(this, 
       android.R.layout.simple_spinner_item, listOfTemps); 
     getTempAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 

     for (int i = 0; i < 5; i++) { 
      answer = Double.parseDouble(twoDecimalFormat.format(temp)); 
      temporary = temporaryTemperature + i; 
      tempText = temporary.toString(); 
      tempText = tempText + " " + goingFrom + " = "; 
      tempText = tempText + answer.toString(); 
      tempText = tempText + " " + goingTo; 
      listOfTemps.add(tempText); 
     } 
     nextTempsSpinner.setAdapter(getTempAdapter); 
    } 
} 

是的,我有叫UnitConverter的Java文件并没有什么特别的,只是这个

public class UnitConverter { 
    public static double CelsiusToFahrenheit(double c){ 
     return 32+c*9/5; 
    } 

    public static double FahrenheitToCelsius(double f){ 
     return (f-32)*5/9; 
    } 
} 

转换部分肯定能行,因为这样做的单选按钮,转换按钮。在onClick方法的某处,我正在编写微调器,它似乎已经失灵,现在整个应用程序崩溃。谢谢你们的帮助。

编辑:logcat的信息如下:

08-13 15:30:31.557 2398-2398/com.aly.converttemps I/art: Not late-enabling -Xcheck:jni (already on) 

                 [ 08-13 15:30:31.610 1580: 1601 D/   ] 
                 HostConnection::get() New Host Connection established 0x7f0863664ec0, tid 1601 
08-13 15:30:31.632 2398-2398/com.aly.converttemps W/System: ClassLoader referenced unknown path: /data/app/com.aly.converttemps-2/lib/x86_64 
08-13 15:30:36.881 2398-2398/com.aly.converttemps W/System: ClassLoader referenced unknown path: /data/app/com.aly.converttemps-2/lib/x86_64 
08-13 15:30:37.106 2398-2548/com.aly.converttemps D/OpenGLRenderer: Use EGL_SWAP_BEHAVIOR_PRESERVED: true 

                    [ 08-13 15:30:37.113 2398: 2398 D/   ] 
                    HostConnection::get() New Host Connection established 0x7f086f9941c0, tid 2398 


                    [ 08-13 15:30:37.152 2398: 2548 D/   ] 
                    HostConnection::get() New Host Connection established 0x7f086f994440, tid 2548 
08-13 15:30:37.163 2398-2548/com.aly.converttemps I/OpenGLRenderer: Initialized EGL, version 1.4 

                    [ 08-13 15:30:37.198 1209: 2251 D/   ] 
                    HostConnection::get() New Host Connection established 0x7f4b63d56500, tid 2251 
08-13 15:30:45.585 2398-2398/com.aly.converttemps D/AndroidRuntime: Shutting down VM 


                    --------- beginning of crash 
08-13 15:30:45.586 2398-2398/com.aly.converttemps E/AndroidRuntime: FATAL EXCEPTION: main 
                    Process: com.aly.converttemps, PID: 2398 
                    java.lang.NumberFormatException: Invalid double: "android.widget.EditText{1495b6d VFED..CL. .F....ID 42,42-592,144 #7f0b0003 app:id/editTemperature}" 
                     at java.lang.StringToReal.invalidReal(StringToReal.java:63) 
                     at java.lang.StringToReal.initialParse(StringToReal.java:114) 
                     at java.lang.StringToReal.parseDouble(StringToReal.java:282) 
                     at java.lang.Double.parseDouble(Double.java:301) 
                     at com.aly.converttemps.MainActivity.onClick(MainActivity.java:75) 
                     at android.view.View.performClick(View.java:5198) 
                     at android.view.View$PerformClick.run(View.java:21147) 
                     at android.os.Handler.handleCallback(Handler.java:739) 
                     at android.os.Handler.dispatchMessage(Handler.java:95) 
                     at android.os.Looper.loop(Looper.java:148) 
                     at android.app.ActivityThread.main(ActivityThread.java:5417) 
                     at java.lang.reflect.Method.invoke(Native Method) 
                     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 
                     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 
+1

如果崩溃,然后张贴的logcat-ERRORMESSAGE-堆栈跟踪......我们需要这些信息 –

+0

你能请张贴整个痕迹? –

+0

嗨,是的,我刚刚添加了logcat错误信息(抱歉关于格式) – butimnotarapper

回答

3

您传递parseDouble(字符串)作为字符串EDITTEXT对象的引用。

变化:

temporaryTemperature = Double.parseDouble(String.valueOf(temp)); 

到:

temporaryTemperature = Double.parseDouble(temp.getText().toString()); 

或:

temporaryTemperature = Double.valueOf(temp.getText().toString()) 
+2

这里给出的两行代码给出了相同的结果。他们都将'double'转换为'String'表示。授予第二个更短,可能是首选。但是,该行不是**错误的原因。堆栈跟踪表明问题出在调用'Double.parseDouble()'的一行。 –

+0

是的,我确实更新了我的答案!对不起 –

+0

刚刚尝试过,但我的应用程序仍然崩溃。我将尝试重新启动计算机,因为它仿佛模拟器突然变得非常慢。但是,除了函数的实际转换部分之外,我为微调控件编写的代码并将ArrayAdapter加载到它的代码中工作还是有问题(也许日志猫还没有到) – butimnotarapper

1

看这行代码:

temporaryTemperature = Double.parseDouble(String.valueOf(temp)); 

变量temp声明为:

private EditText temp; 

注意tempEditText。匹配此调用的唯一版本String.valueOf()the one which takes an Object parameter。这与调用temp.toString()相同,后者输出关于EditText对象的类名和一些其他信息。

你需要找回这是由用户键入的文本:

temporaryTemperature = Double.parseDouble(temp.getText().toString()); 
+0

刚刚尝试过,但我的应用程序仍在崩溃。我将尝试重新启动计算机,因为它仿佛模拟器突然变得非常慢。但是,除了功能的实际转换部分之外,我为微调控制器写入的代码并将ArrayAdapter加载到其中的代码是否正常工作,或者是否也有问题(也许日志猫还没有到达) – butimnotarapper

+0

@butimnotarapper初始化微调器的代码看起来大部分是正确的。但是,'listOfTemps'是空的,所以没有项目会被列在微调器中。我建议你学习[字符串数组资源](https://developer.android.com/guide/topics/resources/string-resource.html#StringArray)。如果您对此有任何疑问,您应该发布一个全新的问题。 –