2012-10-18 50 views
1

我是Java和Android的新手。我試圖製作一個應用程序來計算圓柱體中液體的體積,然後將結果返回到textView框。但是現在當我點擊計算按鈕時,它正在崩潰,我不知道我錯過了什麼。一切都很好。android.widget.Button中的致命異常

package com.somename.fuel.volume.calculator; 

import android.os.Bundle; 
import android.view.View; 
import android.widget.Button; 
import android.widget.EditText; 
import android.widget.TextView; 
import android.app.Activity; 

public class CalculateCylinder extends Activity { 

EditText length, width, height, depth; 
TextView result; 
Button calculate; 
double firstNum, secNum, thirdNum, volume, area; 
double liqVolume; 
double radius; 
double a, l, aSide,aTop,b,Arc,FluidSurfaceAreaTotal,r,d,v,h,fsal; 

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.calculate_cylinder); 

    calculate = (Button) findViewById(R.id.buttonCylCalc); 

    length = (EditText) findViewById(R.id.editCylLength); 
    height = (EditText) findViewById(R.id.editCylHeight); 
    depth = (EditText) findViewById(R.id.editCylDepth); 
    result = (TextView) findViewById(R.id.buttonCylResult); 

    calculate.setOnClickListener(new View.OnClickListener() { 

     public void onClick(View v) { 
      // TODO Auto-generated method stub 
      //Toast.makeText(getApplicationContext(), (CharSequence) result, Toast.LENGTH_LONG).show(); 
      try { 
       calculate(); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
      result.setText((CharSequence) result); 
     } 

     public TextView calculate() throws Exception { 
      // TODO Auto-generated method stub 
      double firstNum = Double.valueOf(length.getText().toString()); 
      double secNum = Double.valueOf(height.getText().toString()); 
      double thirdNum = Double.valueOf(depth.getText().toString()); 

      radius = (secNum/2); 
      area = ((secNum*secNum)*3.14); 
      //liqVolume = (firstNum) * (radius*radius)(acos(radius-depth/radius)) 
      // Cubic Volume 

      v = aSide * l; 
      // Fluid surface Area, Side 
      aSide = (r*r)*(3.14/2 -Math.acos(1-h/r)) - (r-h)*Math.sqrt(h*(2*r-h)); 
      // Fluid Surface Area Top 
      aTop = 2*Math.sqrt((r*r)-((r-h)*(r-h) * l)); 
      // Fluid Surface Area Bottom 
      b = fsal*l; 
      // Fluid Surface Area Total 
      FluidSurfaceAreaTotal = 2*aSide+aTop+b; 
      // Cylinder Radius 
      r = d/2; 
      // Cylinder Diameter 
      d = 2*r; 
      if (h <= r) 
       // Fluid Side Arc Length 
       fsal = 2*r*Math.acos((r-h)/r); 

      else if (h > r) 
       fsal = 2*r*(3.14-Math.acos((h-r)/r)); 
      return result; 
      } 


    }); 
} 

} 

下面是一個logcat的:

10-18 05:24:38.893: E/AndroidRuntime(964): FATAL EXCEPTION: main 
10-18 05:24:38.893: E/AndroidRuntime(964): java.lang.ClassCastException: android.widget.Button 
10-18 05:24:38.893: E/AndroidRuntime(964): at com.dbryant423.fuel.volume.calculator.CalculateCylinder$1.onClick(CalculateCylinder.java:55) 
10-18 05:24:38.893: E/AndroidRuntime(964): at android.view.View.performClick(View.java:2408) 
10-18 05:24:38.893: E/AndroidRuntime(964): at android.view.View$PerformClick.run(View.java:8816) 
10-18 05:24:38.893: E/AndroidRuntime(964): at android.os.Handler.handleCallback(Handler.java:587) 
10-18 05:24:38.893: E/AndroidRuntime(964): at android.os.Handler.dispatchMessage(Handler.java:92) 
10-18 05:24:38.893: E/AndroidRuntime(964): at android.os.Looper.loop(Looper.java:123) 
10-18 05:24:38.893: E/AndroidRuntime(964): at android.app.ActivityThread.main(ActivityThread.java:4627) 
10-18 05:24:38.893: E/AndroidRuntime(964): at java.lang.reflect.Method.invokeNative(Native Method) 
10-18 05:24:38.893: E/AndroidRuntime(964): at java.lang.reflect.Method.invoke(Method.java:521) 
10-18 05:24:38.893: E/AndroidRuntime(964): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868) 
10-18 05:24:38.893: E/AndroidRuntime(964): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626) 
10-18 05:24:38.893: E/AndroidRuntime(964): at dalvik.system.NativeStart.main(Native Method) 

我一直令人頭大我的大腦,試圖找出如何做數學題就這一點,我已經無法找到答案爲什麼它崩潰。我相信這可能是一些簡單的事情,我已經錯過了某個地方。如果你需要其他文件的更多信息,請告訴我,但這個問題似乎是唯一的問題。我也知道還有未使用的變量,我還沒有刪除。

回答

0
result.setText((CharSequence) result); 

此行的原因異常,因爲你是鑄造的Android ViewCharSequence類。

可能的解決方案:你的方法

更改返回類型public TextView calculate()

public String calculate() 

現在,在方法public String calculate()結果fsal

返回字符串,你的按鈕的Click()是一樣的東西,

calculate.setOnClickListener(new View.OnClickListener() { 
     public void onClick(View v) { 
      // TODO Auto-generated method stub 
      //Toast.makeText(getApplicationContext(), (CharSequence) result, Toast.LENGTH_LONG).show(); 
      String resultValue = ""; 
      try { 
      resultValue = calculate(); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
      result.setText(resultValue); 
     } 
+0

好吧,那沒用。首先,我需要返回「v」的值並將該值設置爲onClick方法中的setText。當我將計算類型更改爲字符串時,我得到一個「類型不匹配,不能從雙精度轉換爲字符串。 – poboy975

+0

從'calculate()'返回值之前,只需將它從Double改爲String – user370305

+0

嗯,我添加了這個'String finalresult = Double.valueOf(v).toString(); \t \t \t \t \t result.setText(finalresult);'到calculate()的結尾。 NaN ....所以我認爲它的工作,但我的數學是關閉的地方...感謝您的幫助,雖然 – poboy975

0
result = (TextView) findViewById(R.id.buttonCylResult); 

您是否正確投票?基於命名,我會說你是從一個按鈕投射到TextView。嘗試改變,

result = (Button) findViewById(R.id.buttonCylResult); 
+0

嗯,我鑄造到一個按鈕,它比一個textView框突出顯示,但它似乎並沒有區別瓦特如果我改爲按鈕,仍然會給我0.0或NaN的結果。雖然它不應該嗎?我發送一個字符串,並且textView和Button都會接受該文本。 – poboy975