2016-07-31 7 views
0

私はこれを初めて使っています。私は別の答えからいくつかのコードに従おうとしています。計算に使用される数字を入力するための3つのテキストフィールドがあり、その下のボタンはその下のテキストを答えに変更するはずです。アプリケーションを実行するとエラーは表示されませんが、ボタンを押すとアプリケーションがクラッシュし、ログにエラーメッセージが表示されます。これはコードです:ここではアンドロイドで電卓を作る。アプリはエラーなしでエミュレータに表示されますが、計算ボタンを押すとクラッシュします。

public class CalculatorActivity extends AppCompatActivity { 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_calculator); 
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
    setSupportActionBar(toolbar); 

    class NewActivity extends CalculatorActivity { 
     //Declare textviews as fields, so they can be accessed throughout the activity. 
     EditText editTextSubsPrevious; 
     EditText editTextSubsNow; 
     EditText editTextDays; 
     TextView calcText; 
     Button calcButton; 

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

      //Bind the EditText views 

      editTextSubsPrevious = (EditText) findViewById(R.id.editTextSubsPrevious); 
      editTextSubsNow = (EditText) findViewById(R.id.editTextSubsNow); 
      editTextDays = (EditText) findViewById(R.id.editTextDays); 

      calcButton = (Button) findViewById(R.id.calcButton);{ 
       View.OnClickListener onClickListener = new Button.OnClickListener() { 
        @Override 
        public void onClick(View v) { 
         //When the button is clicked, call the calculate method. 
         calculate(); 
        } 
       }; 
      } 
     } 

     public void calculate(){ 
      //get entered texts from the edittexts,and convert to integers. 
      Double value1 = Double.parseDouble(editTextSubsPrevious.getText().toString()); 
      Double value2 = Double.parseDouble(editTextSubsNow.getText().toString()); 
      Double value3 = Double.parseDouble(editTextDays.getText().toString()); 
      //do the calculation 
      Double difference = (value2 - value1)/7; 
      Double percent = (difference/325); 
      Double amount; 
      amount = value2 * Math.pow(1 + percent, value3); 
      calcText.setText(amount.toString()); 

     } 

    } 
} 

}

はエラーメッセージです:ここで

FATAL EXCEPTION: main 
Process: com.pausetheapp.futurefollowerandsubscribercalculator, PID: 3420 
java.lang.IllegalStateException: Could not find method sendMessage(View) in a parent or ancestor Context for android:onClick attribute defined on view class android.support.v7.widget.AppCompatButton with id 'calcButton' 
    at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.resolveMethod(AppCompatViewInflater.java:325) 
    at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:284) 
    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) 

はXMLファイルです:

<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" 
android:paddingBottom="@dimen/activity_vertical_margin" 
android:paddingLeft="@dimen/activity_horizontal_margin" 
android:paddingRight="@dimen/activity_horizontal_margin" 
android:paddingTop="@dimen/activity_vertical_margin" 
app:layout_behavior="@string/appbar_scrolling_view_behavior" 
tools:context="com.pausetheapp.futurefollowerandsubscribercalculator.CalculatorActivity" 
tools:showIn="@layout/activity_calculator"> 

<TextView 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:textAppearance="?android:attr/textAppearanceLarge" 
    android:text="@string/textViewTitle" 
    android:id="@+id/textViewTitle" 
    android:textAlignment="center" 
    android:layout_alignParentTop="true" 
    android:layout_alignParentLeft="true" 
    android:layout_alignParentStart="true" /> 

<EditText 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:inputType="number" 
    android:ems="10" 
    android:id="@+id/editTextSubsPrevious" 
    android:layout_marginTop="28dp" 
    android:layout_below="@+id/textViewTitle" 
    android:layout_centerHorizontal="true" 
    android:hint="@string/previousSubsTextField" 
    android:width="300dp" /> 

<EditText 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:inputType="number" 
    android:ems="10" 
    android:id="@+id/editTextSubsNow" 
    android:layout_below="@+id/editTextSubsPrevious" 
    android:layout_centerHorizontal="true" 
    android:layout_marginTop="24dp" 
    android:width="300dp" 
    android:hint="@string/currentSubsTextField" /> 

<EditText 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:inputType="number" 
    android:ems="10" 
    android:id="@+id/editTextDays" 
    android:hint="@string/daysTextField" 
    android:width="300dp" 
    android:layout_marginTop="30dp" 
    android:layout_below="@+id/editTextSubsNow" 
    android:layout_alignLeft="@+id/editTextSubsNow" 
    android:layout_alignStart="@+id/editTextSubsNow" /> 

<TextView 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:textAppearance="?android:attr/textAppearanceSmall" 
    android:text="@string/accuracyText" 
    android:id="@+id/textViewAccuracy" 
    android:layout_below="@+id/editTextDays" 
    android:layout_alignLeft="@+id/editTextDays" 
    android:layout_alignStart="@+id/editTextDays" 
    android:textSize="10dp" /> 

<Button 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:text="@string/calculateButton" 
    android:id="@+id/calcButton" 
    android:layout_marginTop="42dp" 
    android:layout_below="@+id/textViewAccuracy" 
    android:layout_centerHorizontal="true" /> 

<TextView 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:textAppearance="?android:attr/textAppearanceLarge" 
    android:text="@string/calcDays" 
    android:id="@+id/calcText" 
    android:layout_marginTop="22dp" 
    android:textSize="25dp" 
    android:layout_below="@+id/calcButton" 
    android:layout_centerHorizontal="true" 
    android:gravity="center" /> 

私はちょうどに次の行を追加しましたjavaファイル

calcText = (TextView) findViewById(R.id.calcText); 
+0

を使用する必要がある他の

android:onClick="onClick" 

使用する必要があり、私はエラーが、それでもボタンを修正しました動作していません。 – PauseTheCat

+0

あなたのコードにcalcTextを作成していないように見えるので、calcText(あなたが作成した場所が表示されないのでnull)でsetTextを呼び出そうとすると、アプリケーションがクラッシュします.. –

+0

あなたのレイアウトファイルも共有してください。 – W0rmH0le

答えて

0

エラーの2 possibilites

1あなたはcalcText

calcText.setText(amount.toString()); 

2>または

Double value1 = Double.parseDouble(editTextSubsPrevious.getText().toString()); 
     Double value2 = Double.parseDouble(editTextSubsNow.getText().toString()); 
     Double value3 = Double.parseDouble(editTextDays.getText().toString()); 

editTextSubsPrevious,`editTextSubsNow`,`editTextDays` => does not contain numbers so that it can be parsed to `Doubles` 
0

おそらく、あなたが属性を以下しているかもしれませを定義していない>がありますレイアウトXMLファイル:

android:onClick="sendMessage" 

その後、あなたは、メソッドsendMessage(View view)用アンドロイドの検索をクリックして、(あなたが実装されていなかったので)それは

を見つけることができませんアンドロイドのための親または祖先コンテキスト方法のsendMessage(ビュー)を見つけることができませんでした:のonClickだから、「calcButton」

idを持つビュークラスandroid.support.v7.widget.AppCompatButtonに定義された属性には、お使いのアールは、実行時にonClickListenerを設定するので、私はあなたがレイアウトファイルからandroid:onClick="sendMessage"を削除することができると思います。次のように

はまた、以下の行を固定する必要があります。

calcButton = (Button) findViewById(R.id.calcButton); 
calcButton.setOnClickListener(new View.OnClickListener() { 
    @Override 
    public void onClick(View v) { 
     //When the button is clicked, call the calculate method. 
     calculate(); 
    } 
}); 
+0

javaにcalcTextを追加しましたが、xmlファイルの "sendMessage"が取り除かれました。残念ながら、計算ボタンを押してもまだ動作していません。何も変わりません。 – PauseTheCat

+0

Ok ..私はいくつかの他のエラーを起こすことができました。例えば、あなたは別のアクティビティの中に1つのアクティビティを作成しました。ここであなたのコードをシミュレートし、アップデートを返します。 – W0rmH0le

+0

@PauseTheCatあなたのコードに適切な修正を準備するためにactivity_calculatorも共有してください。 – W0rmH0le

0

あなたのレイアウトでは、おそらくあなたはonClickイベントを処理するためのsendMessage()メソッドが割り当てられているし、活動のいずれかのような方法を作成していません。

レイアウトでandroid:onClick="sendMessage"を確認してください。

メソッドsendMessage(ビューの表示)を作成し、そこにコードを書き込むか削除して、calcBtn.setOnClickListner(View.OnClickListnerオブジェクト)を使用します。

0

ボタンに応じて、あなたのアプリケーションがクラッシュした場合、それは次のように起因する可能性がクリックした場合:

  1. あなたが存在しないレイアウト.xmlファイル内のボタン のonClick属性のために登録された関数アクティビティ。onClick属性の関数名が、アクティビティで呼び出すことを意味する関数名と一致することを確認できます。
  2. onClick関数の何かが例外を引き起こします。この場合、デバッガを使用するには、 内のブレークポイントを設定し、コードと値を調べて、プログラムを使用して を実行します。 Debug Your App
0

ウルこの

calcButton = (Button) findViewById(R.id.calcButton);{ 
        View.OnClickListener onClickListener =   new Button.OnClickListener() { 
         @Override 
         public void onClick(View v) { 
          //When the button is clicked, call the calculate method. 
          calculate(); 
         } 
        }; 
       } 

を使用している場合uはuが実際に

    calcButton.setOnClickListener(new View.OnClickListener(){ 
        @Override 
        public void onClick(View v) { 
         //When the button is clicked, call the  calculate method. 
           calculate(); 
           } 

     }); 
関連する問題