2016-08-13 7 views
0

FarhenheitとCelsiusを変換するアプリケーションを作成し、次の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メソッドのどこかに、それはひそかになっているように見え、今やアプリケーション全体がクラッシュします。あなたの助けを借りてくれてありがとう。

EDIT:次のように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のString(文字列)などのEditTextオブジェクトの参照を渡しています。

変更:

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

へ:

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

か:このコード行で

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

ここに示したコードはどちらも同等の結果が得られます。彼らは両方とも 'double'を' String'表現に変換します。 2番目が短く、おそらく好ましいと認められる。ただし、この行は**エラーの原因ではありません**。 stacktraceは、問題が 'Double.parseDouble()'を呼び出す行にあることを示します。 –

+0

はい、本当に私は私の答えを更新しました!申し訳ありません –

+0

これは今試しましたが、私のアプリはまだクラッシュしています。エミュレータのように突然非常に遅くなってしまったので、私はコンピュータを再起動しようとします。しかし、機能の実際の変換部分を除いて、私はスピナーのために書いたコードとそれにArrayAdapterを読み込んでいますか、それに何か問題があります(おそらくログキャットはまだ得られませんでした) – butimnotarapper

1

ルック:

temporaryTemperature = Double.parseDouble(String.valueOf(temp)); 
tempEditTextであることを

private EditText temp; 

注:

は変数tempは次のように宣言されています。この呼び出しに一致する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)について学ぶことをお勧めします。これ以上質問がある場合は、新しい質問を投稿する必要があります。 –

関連する問題