2017-04-25 131 views
1

我建立了一個簡單的項目,它可以對給定的數字進行平方。在那個應用程序,只要我點擊按鈕「計算」它說「不幸的是,SquareCalculator已停止」。我該怎麼做才能解決這個問題?只要我點擊按鈕,應用程序就停止工作

下面是我的全部代碼: -

MainActivity.java

package thenerdimite.squarecalculator; 

import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.view.View; 
import android.widget.EditText; 
import android.widget.TextView; 

public class MainActivity extends AppCompatActivity { 

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

    protected void calculate (View v){ 
     EditText input = (EditText) findViewById(R.id.etInput); 
     TextView output = (TextView) findViewById(R.id.tvOutput); 

     int base = Integer.valueOf(input.getText().toString()); 
     int result = base * base; 
     String formattedResult = String.format("%,d", result); 

     output.setText("Result: " + formattedResult); 
    } 

} 

activity_main.xml中

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    tools:context="thenerdimite.squarecalculator.MainActivity"> 

    <EditText 
     android:id="@+id/etInput" 
     android:layout_width="245dp" 
     android:layout_height="41dp" 
     android:layout_marginTop="15dp" 
     android:ems="10" 
     android:inputType="number" 
     tools:layout_editor_absoluteX="16dp" 
     tools:layout_editor_absoluteY="62dp" 
     android:layout_below="@+id/tvInput" 
     android:layout_alignStart="@+id/tvInput" /> 

    <Button 
     android:id="@+id/btnCalculate" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignStart="@+id/etInput" 
     android:layout_below="@+id/etInput" 
     android:layout_marginTop="20dp" 
     android:onClick="Calculate" 
     android:text="Calculate" 
     android:textSize="18sp" /> 

    <TextView 
     android:id="@+id/tvOutput" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="Result:" 
     android:textAppearance="@style/TextAppearance.AppCompat.Display1" 
     android:layout_below="@+id/btnCalculate" 
     android:layout_alignStart="@+id/btnCalculate" 
     android:layout_marginTop="18dp" /> 

    <TextView 
     android:id="@+id/tvInput" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="Enter an Integer:" 
     android:textAppearance="@style/TextAppearance.AppCompat.Display1" 
     android:layout_marginStart="19dp" 
     android:layout_alignParentTop="true" 
     android:layout_alignParentStart="true" /> 

</RelativeLayout> 

logcat的

04-25 09:28:05.060 3596-3596/thenerdimite.squarecalculator D/AndroidRuntime: Shutting down VM 
04-25 09:28:05.060 3596-3596/thenerdimite.squarecalculator W/dalvikvm: threadid=1: thread exiting with uncaught exception (group=0xa5007678) 
04-25 09:28:05.060 3596-3596/thenerdimite.squarecalculator E/AndroidRuntime: FATAL EXCEPTION: main 
                      java.lang.IllegalStateException: Could not find method Calculate(View) in a parent or ancestor Context for android:onClick attribute defined on view class android.support.v7.widget.AppCompatButton with id 'btnCalculate' 
                       at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.resolveMethod(AppCompatViewInflater.java:327) 
                       at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:284) 
                       at android.view.View.performClick(View.java:4240) 
                       at android.view.View$PerformClick.run(View.java:17721) 
                       at android.os.Handler.handleCallback(Handler.java:730) 
                       at android.os.Handler.dispatchMessage(Handler.java:92) 
                       at android.os.Looper.loop(Looper.java:137) 
                       at android.app.ActivityThread.main(ActivityThread.java:5103) 
                       at java.lang.reflect.Method.invokeNative(Native Method) 
                       at java.lang.reflect.Method.invoke(Method.java:525) 
                       at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737) 
                       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 
                       at dalvik.system.NativeStart.main(Native Method) 
04-25 09:28:06.740 3596-3596/? I/Process: Sending signal. PID: 3596 SIG: 9 

AndroidManifest.xml中

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="thenerdimite.squarecalculator"> 

    <application 
     android:allowBackup="true" 
     android:icon="@mipmap/ic_launcher" 
     android:label="@string/app_name" 
     android:roundIcon="@mipmap/ic_launcher_round" 
     android:supportsRtl="true" 
     android:theme="@style/AppTheme"> 
     <activity android:name=".MainActivity"> 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 

       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity> 
    </application> 

</manifest> 
+0

嘗試的情況下匹配;),即'calculate'並不像'Calculate' – NitroNbg

+0

我試過,但沒有奏效 – Bhavesh

+1

'公共無效計算(查看視圖)'不保護 – dit

回答

1

使用documentation of Button

你看方法需要公開,並接受View

爲了這個工作,方法必須公開,並接受一個View作爲其唯一的參數。

所以應該

public void Calculate (View v){ 

使用XML註釋,當然,你應該把它calculate和糾正XML

+1

謝謝這麼多公開的方法使它的工作完美。非常感謝你 – Bhavesh

+0

@Bhavesh我很高興能幫上忙。嘗試做一些關於具體例外的研究,那些是一些通常的例外 – AxelH

+0

我實際上做過研究但與我的案例無關。對不起; p – Bhavesh

1

從我所看到的,問題是,你的按鈕操作是機器人:的onClick =「計算」,但應該是安卓的onClick =「計算」

1

變化android:onClick="Calculate"android:onClick="calculate"。 另外calculate方法應該是public

+0

感謝,改變它的值相同向公衆開放它的工作 – Bhavesh

+1

你的意思是'onClick'而不是'text';)按鈕的標籤並不重要 – AxelH

+0

對。複製錯誤的代碼行X) –

1

你需要做的方法publicprotectedprivate方法不是通過XML訪問。

public void calculate (View v){ 
      EditText input = (EditText) findViewById(R.id.etInput); 
      TextView output = (TextView) findViewById(R.id.tvOutput); 

      int base = Integer.valueOf(input.getText().toString()); 
      int result = base * base; 
      String formattedResult = String.format("%,d", result); 

      output.setText("Result: " + formattedResult); 
     } 
相關問題