2016-09-15 54 views
0

我目前正在努力與此溫度轉換器應用程序。這個應用程序的工作原理是,如果我在空白文本中輸入一個數字,它將計算到其他溫度單位,而無需單擊按鈕(由文本監視器)Stuck with Android Studio:對文本觀察者使用「雙」

這裏,我需要使用Double值從EditText並使用該值創建一個公式並將其插入結果視圖。因此,在這種情況下,我正在使用:

double tempWantCtoF = 1.8 * tempWhat + 32; 
double tempWantFtoC = tempWhat - 32 * 0.55; 

和temp在EditText中插入的值是什麼。

應用程序功能正常,直到我在文本字段中鍵入任何數字並且應用程序崩潰到主屏幕並顯示錯誤消息,「不幸的是,應用程序名稱已停止。」

我認爲這是使用Text Watcher方法實現中的afterTextChanged下的double值的問題。

如果有人知道可能導致問題的原因,我會非常感激。

這是我的主要活動的XML文件:

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:paddingBottom="@dimen/activity_vertical_margin" 
    android:paddingLeft="@dimen/activity_horizontal_margin" 
    android:paddingRight="@dimen/activity_horizontal_margin" 
    android:paddingTop="@dimen/activity_vertical_margin" 
    tools:context="josephshin.tempconv.MainActivity" 
    android:textAlignment="center"> 

    <Switch 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:id="@+id/tempSwitch" 
     android:layout_alignParentTop="true" 
     android:layout_centerHorizontal="true" 
     android:checked="false" /> 

    <TextView 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:textAppearance="?android:attr/textAppearanceLarge" 
     android:id="@+id/tempIndicator" 
     android:layout_below="@+id/tempSwitch" 
     android:layout_centerHorizontal="true" 
     android:text="@string/c_to_f" 
     android:layout_marginTop="20dp" /> 

    <TextView 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:textAppearance="?android:attr/textAppearanceLarge" 
     android:text="@string/is" 
     android:id="@+id/isLabel" 
     android:layout_centerVertical="true" 
     android:layout_centerHorizontal="true" /> 

    <TextView 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:textAppearance="?android:attr/textAppearanceLarge" 
     android:text="@string/enter_your_temperature" 
     android:id="@+id/tempResult" 
     android:layout_below="@+id/isLabel" 
     android:layout_centerHorizontal="true" 
     android:singleLine="true" 
     android:layout_marginTop="85dp" /> 

    <EditText 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:inputType="numberDecimal" 
     android:ems="10" 
     android:id="@+id/tempEdit" 
     android:layout_below="@+id/tempIndicator" 
     android:layout_centerHorizontal="true" 
     android:layout_marginTop="49dp" 
     android:hint="@string/enter_your_temperature" 
     android:textAlignment="center" /> 
</RelativeLayout> 

,這是我的主要活動的Java文件:

package josephshin.tempconv; 

import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.text.Editable; 
import android.text.TextWatcher; 
import android.widget.CompoundButton; 
import android.widget.EditText; 
import android.widget.Switch; 
import android.widget.TextView; 

public class MainActivity extends AppCompatActivity { 

boolean CtoF; 
double tempWhat; 
double tempWantCtoF = 1.8 * tempWhat + 32; 
double tempWantFtoC = tempWhat - 32 * 0.55; 

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

    final Switch tempSwitch = (Switch) findViewById(R.id.tempSwitch); 
    final TextView tempIndicator = (TextView) findViewById(R.id.tempIndicator); 
    final EditText tempLabel = (EditText) findViewById(R.id.tempEdit); 
    final TextView result = (TextView) findViewById(R.id.tempResult); 


    tempSwitch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 
     @Override 
     public void onCheckedChanged(CompoundButton compoundButton, boolean isChecked) { 
      if (isChecked) { 
       tempIndicator.setText("°F to °C"); 
       CtoF = false; 
      } 
      else { 
       tempIndicator.setText("°C to °F"); 
       CtoF = true; 
      } 
     } 
    }); 
    tempLabel.addTextChangedListener(new TextWatcher() { 
     @Override 
     public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) { 

     } 

     @Override 
     public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) { 

     } 

     @Override 
     public void afterTextChanged(Editable edi) { 
      tempWhat = Double.parseDouble(tempLabel.toString()); 
      if (CtoF){ 
       result.setText("" + tempWantCtoF); 
      } 
      if (!CtoF){ 
       result.setText("" + tempWantFtoC); 
      } 
     } 
    }); 
} 
} 

THANK YOU! PS。我是初學者!剛開始進入這個領域,但似乎無法找到足夠相似的問題。

編輯> 的logcat離職的文本框爲空

FATAL EXCEPTION: main 
                    Process: josephshin.tempconv, PID: 31895 
                    java.lang.NumberFormatException: Invalid double: "" 
                     at java.lang.StringToReal.invalidReal(StringToReal.java:63) 
                     at java.lang.StringToReal.parseDouble(StringToReal.java:267) 
                     at java.lang.Double.parseDouble(Double.java:301) 
                     at josephshin.tempconv.MainActivity$2.afterTextChanged(MainActivity.java:56) 
                     at android.widget.TextView.sendAfterTextChanged(TextView.java:9271) 
                     at android.widget.TextView$ChangeWatcher.afterTextChanged(TextView.java:12015) 
                     at android.text.SpannableStringBuilder.sendAfterTextChanged(SpannableStringBuilder.java:1047) 
                     at android.text.SpannableStringBuilder.replace(SpannableStringBuilder.java:564) 
                     at android.text.SpannableStringBuilder.delete(SpannableStringBuilder.java:225) 
                     at android.text.SpannableStringBuilder.delete(SpannableStringBuilder.java:34) 
                     at android.text.method.BaseKeyListener.backspaceOrForwardDelete(BaseKeyListener.java:106) 
                     at android.text.method.BaseKeyListener.backspace(BaseKeyListener.java:51) 
                     at android.text.method.BaseKeyListener.onKeyDown(BaseKeyListener.java:215) 
                     at android.text.method.NumberKeyListener.onKeyDown(NumberKeyListener.java:138) 
                     at android.widget.TextView.doKeyDown(TextView.java:7187) 
                     at android.widget.TextView.onKeyDown(TextView.java:6994) 
                     at android.view.KeyEvent.dispatch(KeyEvent.java:3249) 
                     at android.view.View.dispatchKeyEvent(View.java:9838) 
                     at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1739) 
                     at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1739) 
                     at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1739) 
                     at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1739) 
                     at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1739) 
                     at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1739) 
                     at com.android.internal.policy.PhoneWindow$DecorView.superDispatchKeyEvent(PhoneWindow.java:2808) 
                     at com.android.internal.policy.PhoneWindow.superDispatchKeyEvent(PhoneWindow.java:1838) 
                     at android.app.Activity.dispatchKeyEvent(Activity.java:2977) 
                     at android.support.v7.app.AppCompatActivity.dispatchKeyEvent(AppCompatActivity.java:543) 
                     at android.support.v7.view.WindowCallbackWrapper.dispatchKeyEvent(WindowCallbackWrapper.java:53) 
                     at android.support.v7.app.AppCompatDelegateImplBase$AppCompatWindowCallbackBase.dispatchKeyEvent(AppCompatDelegateImplBase.java:312) 
                     at com.android.internal.policy.PhoneWindow$DecorView.dispatchKeyEvent(PhoneWindow.java:2682) 
                     at android.view.ViewRootImpl$ViewPostImeInputStage.processKeyEvent(ViewRootImpl.java:5273) 
                     at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:5226) 
                     at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:4673) 
                     at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:4726) 
                     at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:4692) 
                     at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:4834) 
                     at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:4700) 
                     at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:4891) 
                     at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:4673) 
                     at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:4726) 
                     at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:4692) 
                     at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:4700) 
                     at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:4673) 
                     at android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:7359) 
                     at android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:7237) 
                     at android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:7198) 
                     at android.view.ViewRootImpl$ViewRootHandler.handleMessage(ViewRootImpl.java:4310) 
                     at android.os.Handler.dispatchMessage(Handler.java:102) 
                     at android.os.Looper.loop(Looper.java:158) 
                     at android.app.ActivityThread.main(ActivityThread.java:7225) 
                     at java.lang.reflect.Method.invoke(Native Method) 
                     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230) 
                     a 
+1

試試這個tempLabel.getText()的toString()而不是tempLabel.toString()。併發布您的logcat消息。這將有助於解決這個問題。 – ajantha

+0

@ajantha感謝您的幫助!所以,現在當我輸入任何數字時,它並沒有崩潰,但當我完全將文本字段留空(無數)時,它又回到主屏幕,顯示「app has stopped」消息....呃我會當發生崩潰時,將文本框留空。 –

+0

查看我在下面發佈的答案。 – ajantha

回答

0

你犯了一些錯誤。

首先,你應該申報tempWantCtoFtempWantFtoC爲方法,不變量:

private double tempWantCtoF() { 
    return 1.8 * tempWhat + 32; 
} 

private double tempWantFtoC() { 
    return tempWhat - 32 * 0.55; 
} 

其次,要獲得TextView的文字,不要使用toString,使用getText().toString()代替:

tempWhat = Double.parseDouble(tempLabel.getText().toString()); 

這也是錯誤發生的原因。

您可能還需要添加一些錯誤處理代碼:

try { 
    tempWhat = Double.parseDouble(tempLabel.getText().toString()); 
} catch (NumberFormatException ex) { 
    return; 
} 
+0

非常感謝。現在該公式實際上是功能性的,並且運行起來並沒有崩潰。我感謝您的幫助! –

+0

@ShinJoseph如果您認爲我的答案能解答您的問題,請考慮點擊該選中標記以接受答案! – Sweeper

+0

對不起,遲到了一點。一直忙着編碼.....再次謝謝你! –

0

檢查空字符串,將其轉換爲雙前。 這樣,

 if(tempLabel.getText().toString().equals("")){ 
     tempWhat=0; 
    }else{ 
     tempWhat = Double.parseDouble(tempLabel.getText().toString()); 
    } 
+0

非常感謝你!當文本框回到空白時,它停止崩潰。對此,我真的非常感激! –