2012-11-12 58 views
0

iv創建了一個android應用程序,我的問題是,當我輸入一個數字之前按+ = -/*按鈕我的應用程序停止工作,是否有任何我可以讓它,如果有沒有數字輸入它不停止工作?如果在Android應用程序聲明幫助


package steven.mcilhone.calculatorcoursework; 

import java.math.BigDecimal; 


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


public class Calculator extends Activity { 

EditText firstValue; 
EditText secondValue; 
TextView result; 
Button addbtn, subtractbtn, dividebtn, multiplybtn, equalbtn, clearbtn; 
BigDecimal firstNum, secondNum; 



String Operator = ""; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_calculator); 

    addbtn = (Button) findViewById(R.id.addbtnID); 
    subtractbtn = (Button) findViewById(R.id.subtractbtnID); 
    dividebtn = (Button) findViewById(R.id.dividebtnID); 
    multiplybtn = (Button) findViewById(R.id.multiplybtnID); 
    equalbtn = (Button) findViewById(R.id.equalbtnID); 
    clearbtn = (Button) findViewById(R.id.clearbtn); 
    firstValue = (EditText) findViewById(R.id.edttxt1); 
    secondValue = (EditText) findViewById(R.id.edttxt1); 


    clearbtn.setOnClickListener(new View.OnClickListener() { 

     public void onClick(View v) { 
      // TODO Auto-generated method stub 
      EditText edttxt1 = (EditText) findViewById(R.id.edttxt1); 
      edttxt1.setText(""); 
     } 
    }); 



    addbtn.setOnClickListener(new View.OnClickListener() { 

     public void onClick(View v) { 
      // TODO Auto-generated method stub 

      Operator = "+"; 
      addandclear(); 
     } 
    }); 

    subtractbtn.setOnClickListener(new View.OnClickListener() { 

     public void onClick(View v) { 
      // TODO Auto-generated method stub 
      Operator = "-";    
      addandclear(); 
     } 
    }); 

    dividebtn.setOnClickListener(new View.OnClickListener() { 

     public void onClick(View v) { 
      // TODO Auto-generated method stub 
      Operator = "/"; 
      addandclear(); 

     } 
    }); 

    multiplybtn.setOnClickListener(new View.OnClickListener() { 

     public void onClick(View v) { 
      // TODO Auto-generated method stub 
      Operator = "*"; 
      addandclear(); 
     } 
    }); 

    equalbtn.setOnClickListener(new View.OnClickListener() { 

     public void onClick(View v) { 
      // TODO Auto-generated method stub 
      secondNum = new   BigDecimal(secondValue.getText().toString()); 
      EditText edttxt1 = (EditText) findViewById(R.id.edttxt1); 
      edttxt1.setText(""); 
      if (Operator == "+"){ 
       edttxt1.setText(firstNum.add(secondNum).toString()); 
      } 
      else if (Operator == "-"){ 
       edttxt1.setText(firstNum.subtract(secondNum).toString()); 
      } 
      else if (Operator == "/"){ 
       edttxt1.setText(firstNum.divide(secondNum).toString()); 
      } 
      else if (Operator == "*"){ 
       edttxt1.setText(firstNum.multiply(secondNum).toString()); 
      } 



     } 
    }); 

} 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    getMenuInflater().inflate(R.menu.activity_calculator, menu); 
    return true; 
} 


     public void addandclear(){ 


      firstNum = new BigDecimal(firstValue.getText().toString());    
      EditText edttxt1 = (EditText) findViewById(R.id.edttxt1); 
      edttxt1.setText(""); 
     } 



} 

<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" > 

<EditText 
    android:id="@+id/edttxt1" 
    android:layout_width="250dp" 
    android:layout_height="100dp" 
    android:layout_alignParentRight="true" 
    android:layout_alignParentTop="true" 
    android:background="?android:attr/editTextBackground" 
    android:ems="15" 
    android:inputType="numberDecimal" 
    android:gravity="right"/> 

<Button 
    android:id="@+id/addbtnID" 
    android:layout_width="70dp" 
    android:layout_height="70dp" 
    android:layout_below="@+id/edttxt1" 
    android:layout_marginLeft="20dp" 
    android:text="@string/add" /> 

<Button 
    android:id="@+id/dividebtnID" 
    android:layout_width="70dp" 
    android:layout_height="70dp" 
    android:layout_below="@+id/edttxt1" 
    android:layout_toRightOf="@+id/addbtnID" 
    android:text="@string/divide" /> 

<Button 
    android:id="@+id/multiplybtnID" 
    android:layout_width="70dp" 
    android:layout_height="70dp" 
    android:layout_below="@+id/edttxt1" 
    android:layout_toRightOf="@+id/dividebtnID" 
    android:text="@string/multiply" /> 

<Button 
    android:id="@+id/subtractbtnID" 
    android:layout_width="70dp" 
    android:layout_height="70dp" 
    android:layout_alignBaseline="@+id/multiplybtnID" 
    android:layout_alignBottom="@+id/multiplybtnID" 
    android:layout_toRightOf="@+id/multiplybtnID" 
    android:text="@string/subtract" /> 

<Button 
    android:id="@+id/zerobtn" 
    android:layout_width="70dp" 
    android:layout_height="70dp" 
    android:layout_alignLeft="@+id/addbtnID" 
    android:layout_alignParentBottom="true" 
    android:layout_alignRight="@+id/twobtn" 
    android:text="@string/zero" /> 

<Button 
    android:id="@+id/onebtn" 
    android:layout_width="70dp" 
    android:layout_height="70dp" 
    android:layout_above="@+id/zerobtn" 
    android:layout_alignLeft="@+id/zerobtn" 
    android:text="@string/one" /> 

<Button 
    android:id="@+id/twobtn" 
    android:layout_width="70dp" 
    android:layout_height="70dp" 
    android:layout_above="@+id/zerobtn" 
    android:layout_toLeftOf="@+id/multiplybtnID" 
    android:text="@string/two" /> 

<Button 
    android:id="@+id/threebtn" 
    android:layout_width="70dp" 
    android:layout_height="70dp" 
    android:layout_above="@+id/zerobtn" 
    android:layout_toLeftOf="@+id/subtractbtnID" 
    android:text="@string/three" /> 

<Button 
    android:id="@+id/fourbtn" 
    android:layout_width="70dp" 
    android:layout_height="70dp" 
    android:layout_above="@+id/onebtn" 
    android:layout_toLeftOf="@+id/twobtn" 
    android:text="@string/four" /> 

<Button 
    android:id="@+id/fivebtn" 
    android:layout_width="70dp" 
    android:layout_height="70dp" 
    android:layout_alignBaseline="@+id/fourbtn" 
    android:layout_alignBottom="@+id/fourbtn" 
    android:layout_toLeftOf="@+id/threebtn" 
    android:text="@string/five" /> 

<Button 
    android:id="@+id/sixbtn" 
    android:layout_width="70dp" 
    android:layout_height="70dp" 
    android:layout_alignBaseline="@+id/fivebtn" 
    android:layout_alignBottom="@+id/fivebtn" 
    android:layout_toRightOf="@+id/fivebtn" 
    android:text="@string/six" /> 

<Button 
    android:id="@+id/sevenbtn" 
    android:layout_width="70dp" 
    android:layout_height="70dp" 
    android:layout_above="@+id/fourbtn" 
    android:layout_toLeftOf="@+id/fivebtn" 
    android:text="@string/seven" /> 

<Button 
    android:id="@+id/eightbtn" 
    android:layout_width="70dp" 
    android:layout_height="70dp" 
    android:layout_above="@+id/fivebtn" 
    android:layout_toLeftOf="@+id/sixbtn" 
    android:text="@string/eight" /> 

<Button 
    android:id="@+id/ninebtn" 
    android:layout_width="70dp" 
    android:layout_height="70dp" 
    android:layout_alignBaseline="@+id/eightbtn" 
    android:layout_alignBottom="@+id/eightbtn" 
    android:layout_toRightOf="@+id/eightbtn" 
    android:text="@string/nine" /> 

<Button 
    android:id="@+id/equalbtnID" 
    android:layout_width="70dp" 
    android:layout_height="120dp" 
    android:layout_alignBottom="@+id/threebtn" 
    android:layout_alignTop="@+id/sixbtn" 
    android:layout_toRightOf="@+id/threebtn" 
    android:text="@string/equal" /> 

<Button 
    android:id="@+id/clearbtn" 
    android:layout_width="70dp" 
    android:layout_height="70dp" 
    android:layout_above="@+id/equalbtnID" 
    android:layout_alignLeft="@+id/equalbtnID" 
    android:text="@string/clear" /> 

</RelativeLayout> 
+0

[This](http://stackoverflow.com/questions/513832/how-do-i-compare-strings-in-java)可能會讓你感興趣。 – Pshemo

+0

供將來參考:當您的應用程序崩潰時,您應該始終查看異常的logcat輸出。它爲診斷錯誤提供了寶貴的信息。您也應該始終在您的Android問題中將相關的logcat輸出(如果有的話)包含到SO中。 –

+0

@Pshemo - 這裏不是問題。 –

回答

4

在幾個地方,您將用戶輸入轉換爲BigDecimal而不做任何錯誤檢查。特別是,當沒有輸入時,new BigDecimal(String)將生成NumberFormatException,因爲「」不是有效的數字。從the docs

該字符串必須包含整數或分數中的至少一個數字。

找到你正在使用用戶輸入的每個地方,並進行一些錯誤檢查。例如,在addandclear()

public void addandclear(){ 
    String val = firstValue.getText().toString(); 
    try { 
     firstNum = new BigDecimal(val); 
     EditText edttxt1 = (EditText) findViewById(R.id.edttxt1); 
     edttxt1.setText(""); 
    } catch (NumberFormatException e) { 
     if (val.length() == 0) { 
      // blank field 
     } else { 
      // something wrong with the input 
     } 
    } 
} 
+0

我看到謝謝,你能解釋一下上面發生了什麼,所以我知道下一次該怎麼做? – john

+0

@StevenMcilhone - 這個想法是首先在一個單獨的步驟中檢索輸入字段中的文本,所以它可用於錯誤報告或任何其他。然後,該方法的主體被封裝在try/catch塊中,這樣如果引發異常,它不會使程序崩潰,而是讓您有機會以受控方式報告錯誤。因爲你可能想用不同的方式處理空白字段錯誤,所以我展示瞭如何在catch塊中進行測試。 –

+0

謝謝你們,很好的幫助。 – john

6
if (Operator == "+"){ 

應該

if (Operator.eqauls("+")){ 

同樣適用於其他,如果在你的代碼/ else塊。

在比較字符串(除了字符串文字的情況下,字符串文字可能通過==條件)時,對我們.equals()代替==總是更好。

==檢查引用相等。 equals()檢查內容是否相等。 This discussion可能會對您有所幫助。

編輯:

由於TedHopp評論,你的代碼指的編譯時間常數,字符串比較可能不是這裏的問題,仍高於答案代表字符串比較好做法。

由於沒有可用的問題堆棧跟蹤,假設流程滿足其中一個if/else條件,另一個可能的錯誤是NumberFormatException

確保您在EditText中讀取的數字在創建BigDecimal(String)實例前有效。

+0

謝謝,但它仍然崩潰,如果我輸入數字前按+,任何建議? – john

+0

使用'=='進行比較不是OP的問題。通常,使用'equals()'而不是'=='是個好主意。在這種情況下,所有字符串比較都與編譯時常量有關,所以所有字符串都被執行,並且'=='的行爲與equals()相同。此外,這不會導致應用程序崩潰。 –

+0

@TedHopp:+1,仔細查看問題後,我同意您的評論。附加內容更新答案(與答案基本相同)。 – kosa

0

爲了減少代碼,你可以添加機器人:在XML的onClick =「addandclear」的按鈕(請addandclear採取視圖V作爲參數)。然後通過v.getText()得到運算符。toString()