2016-07-31 44 views
0

Ich bin neu dazu und ich versuche, Code aus einer anderen Antwort zu folgen. Ich habe drei Textfelder, um die Zahlen einzugeben, die für die Berechnung verwendet werden, und eine Schaltfläche darunter, die einen Text unterhalb der Antwort ändern soll. Es werden keine Fehler angezeigt, wenn ich die App starte, aber wenn ich den Knopf drücke, stürzt die App ab und ich bekomme Fehlermeldungen im Log. Dies ist der Code:Einen Rechner in Android machen. Die App erscheint auf dem Emulator ohne Fehler, aber wenn ich den Berechnen Knopf drücke, stürzt es ab

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()); 

     } 

    } 
} 

}

Hier ist die Fehlermeldung:

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) 

Hier ist die XML-Datei:

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

ich diese Linie nur hinzugefügt die Java-Datei.

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

Ich korrigierte den Fehler nur Eigentlich verwenden sollten, müssen verwenden, aber die Taste noch funktioniert nicht. – PauseTheCat

+0

Es sieht so aus, als ob Sie den calcText nicht in Ihrem Code erstellen. Wenn Sie versuchen, setText auf calcText aufzurufen (was null ist, weil ich nicht sehe, wo Sie es erstellt haben), stürzt die App ab. –

+0

Könnten Sie? Bitte teilen Sie Ihre Layout-Datei auch? – W0rmH0le

Antwort

0

Es gibt zwei Möglichkeiten der Fehler

1> Sie haben nicht calcText definiert

calcText.setText(amount.toString()); 

2> Oder Wahrscheinlich

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

Mag sein, Sie haben folgende Attribut in Ihre Layout-XML-Datei:

android:onClick="sendMessage" 

Dann, wenn Sie klicken, android Suche nach Methode sendMessage(View view) und es nicht findet (weil Sie nicht implementiert haben)

Könnte für android nicht Methode nachrichts (View) in einem Elternteil oder Vorfahr Kontext finden : onClick-Attribut definiert auf Ansichtsklasse android.support.v7.widget.AppCompatButton mit id ‚calcButton‘

Also, da Sie sind ein onClickListener zur Laufzeit einstellen, ich glaube, Sie android:onClick="sendMessage" von Layout-Datei löschen.

Auch Zeile unten wie folgt festgesetzt:

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

Ich habe den calcText zum Java hinzugefügt und die "sendMessage" in der XML-Datei gelöscht. Leider funktioniert es immer noch nicht, wenn ich den Berechnen-Knopf drücke. Nichts verändert sich. – PauseTheCat

+0

Ok .. Ich habe mehrere andere Fehler .. Zum Beispiel, Sie haben eine Aktivität in einer anderen erstellt .. Ich werde Ihren Code hier simulieren und mit Updates zurückkehren. – W0rmH0le

+0

@PauseTheCat Könnten Sie bitte auch activity_calculator freigeben, um eine ordnungsgemäße Fehlerbehebung für Ihren Code vorzubereiten? – W0rmH0le

0

In Ihrem Layout höchstwahrscheinlich Sie haben zugewiesen nachrichts() -Methode onClick Ereignis zu behandeln und haben keine solche Methode in Aktivität.

Überprüfen Sie für android:onClick="sendMessage" in Ihrem Layout.

Entweder erstellen Sie eine Methode sendMessage (View anzeigen) und schreiben Sie Ihren Code dort oder entfernen Sie es und verwenden Sie Ihre calcBtn.setOnClickListner (View.OnClickListner Object).

0

Wenn Ihre App stürzt in Reaktion auf eine Schaltfläche klicken, um es folgende Gründe haben könnte:

  1. Die Funktion, die Sie für das onClick-Attribut der Schaltfläche Datei im Layout .xml registriert existiert nicht in die Aktivität.Sie können sicherstellen, dass der Funktionsname im onClick-Attribut mit dem Funktionsnamen übereinstimmt, den Sie in Ihrer Aktivität aufrufen möchten.
  2. Etwas in der OnClick-Funktion verursacht eine Ausnahme. Wenn dies der Fall ist, können Sie den Debugger verwenden, indem Sie innerhalb der Funktion einen Haltepunkt setzen und Ihren Code und Ihre Werte überprüfen, während Sie den Schritt über das Programm ausführen. Debug Your App
0

wenn ur dies mit

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

android:onClick="onClick" 

sonst u

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

     });