2016-07-04 17 views
0

Ich versuche, einen einfachen Rechner mit Android Studio zu machen. Wenn ich jedoch auf die Schaltfläche mit dem Text "1" klicke, stürzt die App ab und die Schaltfläche mit dem Text "2" tut nichts. Ich habe zu Recht Android hinzugefügt: Onclick = "" zum xml. Bitte sehen Sie sich verschiedene Quellcode-Dateien an."Leider <App name> hat aufgehört zu arbeiten" Pop-up, wenn ich auf eine Schaltfläche klicke

** PS: Jetzt versuche ich, die ersten beiden Tasten funktionieren **

activity_main.xml

<?xml version="1.0" encoding="utf-8"?> 
<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" 
android:paddingBottom="@dimen/activity_vertical_margin" 
android:paddingLeft="@dimen/activity_horizontal_margin" 
android:paddingRight="@dimen/activity_horizontal_margin" 
android:paddingTop="@dimen/activity_vertical_margin" 
tools:context="com.example.meenakshi.calculator.MainActivity"> 

<GridLayout 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_centerVertical="true" 
    android:layout_alignParentLeft="true" 
    android:layout_alignParentStart="true"> 

    <Button 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="@string/button_text" 
     android:id="@+id/button" 
     android:layout_row="0" 
     android:layout_column="0" 
     android:textColor="@color/abc_search_url_text_pressed" 
     android:nestedScrollingEnabled="false" 
     android:onClick="press1" /> 


    <Button 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:id="@+id/button16" 
     android:layout_row="0" 
     android:layout_column="3" 
     android:text="@string/buttond_text" /> 

    <Button 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="@string/button4_text" 
     android:id="@+id/button4" 
     android:layout_row="1" 
     android:layout_column="0" /> 

    <Button 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text= "@string/button2_text" 
     android:id="@+id/button2" 
     android:layout_row="0" 
     android:layout_column="1" 
     android:onClick="press2" /> 

    <Button 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="@string/button3_text" 
     android:id="@+id/button3" 
     android:layout_row="0" 
     android:layout_column="2" /> 

    <Button 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="@string/buttonmul_text" 
     android:id="@+id/button15" 
     android:layout_row="1" 
     android:layout_column="3" /> 

    <Button 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="@string/button7_text" 
     android:id="@+id/button7" 
     android:layout_row="2" 
     android:layout_column="0" /> 

    <Button 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="@string/button5_text" 
     android:id="@+id/button5" 
     android:layout_row="1" 
     android:layout_column="1" /> 

    <Button 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="@string/button6_text" 
     android:id="@+id/button6" 
     android:layout_row="1" 
     android:layout_column="2" /> 

    <Button 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="@string/button8_text" 
     android:id="@+id/button8" 
     android:layout_row="2" 
     android:layout_column="1" /> 

    <Button 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="@string/buttonm_text" 
     android:id="@+id/button14" 
     android:layout_row="2" 
     android:layout_column="3" /> 

    <Button 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="@string/button._text" 
     android:id="@+id/button12" 
     android:layout_row="3" 
     android:layout_column="0" /> 

    <Button 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="@string/button0_text" 
     android:id="@+id/button10" 
     android:layout_row="3" 
     android:layout_column="1" /> 

    <Button 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="@string/button9_text" 
     android:id="@+id/button9" 
     android:layout_row="2" 
     android:layout_column="2" /> 

    <Button 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="@string/buttone_text" 
     android:id="@+id/button11" 
     android:layout_row="3" 
     android:layout_column="2" /> 

    <Button 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="@string/buttonp_text" 
     android:id="@+id/button13" 
     android:layout_row="3" 
     android:layout_column="3" /> 
</GridLayout> 

<EditText 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:id="@+id/result" 
    android:layout_alignParentTop="true" 
    android:layout_alignParentLeft="true" 
    android:layout_alignParentStart="true" 
    android:layout_marginTop="32dp" 
    android:inputType="text" /> 

</RelativeLayout> 

MainActivity.java

package com.example.meenakshi.calculator; 


import android.content.DialogInterface; 
import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.widget.EditText; 
import android.view.View; 
import android.widget.Button; 



public class MainActivity extends AppCompatActivity { 

Button btn = (Button)findViewById(R.id.button); 
EditText edittext = (EditText)findViewById(R.id.result); 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

} 

public void press1(View v){ 

    edittext.setText("1"); 
} 

public void press2(View v){ 

     edittext.setText("2"); 
    } 





} 

zu machen AndroidManifest.xml

Stapelüberwachung

java.lang.IllegalStateException: Could not find method press(View) in a parent or ancestor Context for android:onClick attribute defined on view class android.support.v7.widget.AppCompatButton with id 'button' 
                       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:4438) 
                       at android.view.View$PerformClick.run(View.java:18422) 
                       at android.os.Handler.handleCallback(Handler.java:733) 
                       at android.os.Handler.dispatchMessage(Handler.java:95) 
                       at android.os.Looper.loop(Looper.java:136) 
                       at android.app.ActivityThread.main(ActivityThread.java:5001) 
                       at java.lang.reflect.Method.invokeNative(Native Method) 
                       at java.lang.reflect.Method.invoke(Method.java:515) 
                       at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785) 
                       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601) 
                       at dalvik.system.NativeStart.main(Native Method) 
+0

StackTrace sagt drücken, xml Sie geschrieben sagt press1 – Memme

+0

Können Sie das Projekt hier als zip senden und ich werde es beheben. –

+0

@Memme Das habe ich mich auch gefragt. Früher habe ich überall "gedrückt" und der Stack-Trace zeigte auch "drücken". Später habe ich "press" zu "press1" geändert und Stack-Trace zeigt immer noch "press". Versteh nicht was falsch ist. –

Antwort

0

Das Problem hierbei ist, dass Aktivität hat Lebenszyklus und hier wir folgende Sequenz von Ereignissen haben:

  • Initialisierung von Feldern < - hier initialisierte Knopf und EditText (in diesem Moment gibt es kein Layout, so findViewById Renditen null)
  • onCreate() < - hier können Sie das Layout Aufblasen (nach setContentView() können Sie Ihre Ansichten in Layout finden)
Einige Empfehlungen 210

:

nicht onClick in xml verwenden - es macht es nicht offensichtlich, dass etwas hört onClick Ereignis und in oft (Auch hier) es ist die Wurzel der Probleme. Verwenden Sie findViewById(R.id.button).setOnClickListener(); es macht das offensichtlich.

onCreate() sollte die Methode, um alles in Ihrer Tätigkeit

UPDATE

Am Ende zu initialisieren Sie so etwas wie haben würde:

public class MainActivity extends AppCompatActivity implements View.OnClickListener { 
     private EditText result; 
     @Override 
     protected void onCreate(@Nullable Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 
      setContentView(R.layout.activity_main); 
      result = (EditText) findViewById(R.id.result); 
      findViewById(R.id.button1).setOnClickListener(this); 
      findViewById(R.id.button2).setOnClickListener(this); 
     } 

     @Override 
     public void onClick(View v) { 
      Button clickedBtn = (Button) v; 
      switch (v.getId()){ 
       case (R.id.button1): 
       case (R.id.button2): 
        result.append(clickedBtn.getText()); 
        break; 
       default: 
        //some other 
        break; 

      } 
     } 
    } 

Hinweis: es ist besser, Zahlen und Zeichen nicht in strings.xml zu setzen - trotz AS beschwert sich das, aber Sie werden das in Ihrem Programm nicht wiederverwenden und es gibt keinen Fall über transla ting diese saiten :)

+0

Ihre Antwort löste einige meiner Konzepte darüber, was wann zu tun ist, aber es löst das Problem immer noch nicht. Ich habe nur findViewById (R.id.button) .setOnClickListener(); aber ohne Erfolg. –

+0

@ShubhamSharma siehe aktualisiert –

+0

Ich weiß nicht, was mein Problem gelöst hat. Ich, die apk komplett von meinem virtuellen Genymotion-Gerät deinstallierend und neu installierst ODER den ganzen oben angegebenen Code kopierend? Aber jetzt, Ihre sowie meine Änderungen funktioniert magisch gut. Vielen Dank :) –

0

bearbeiten

protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    Button btn = (Button)findViewById(R.id.button); 
    Button btn2 = (Button)findViewById(R.id.button2); 
    EditText edittext = (EditText)findViewById(R.id.result); 


} 
+0

Wenn ich es so mache, erkennt es edittext und btn nicht in press1 und press2. –

+0

nein, es hat keine Auswirkungen auf das –

+0

Ich habe gerade versucht, was Sie erwähnten. Es erkennt Editiertext und BTN nicht. Sorry –

0

Try this:

public class MainActivity extends AppCompatActivity { 

Button btn; 
EditText edittext; 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    edittext = (EditText)findViewById(R.id.result); 
    btn = (Button)findViewById(R.id.button); 

} 
+0

Immer noch nicht funktioniert ... Sorry –

+0

Es funktioniert auf meinem Gerät. –

+0

Es funktioniert jetzt ..... Danke mate –

0

Sie müssen rufen findViewById() nach setContentView().

Button btn = (Button)findViewById(R.id.button); 
EditText edittext = (EditText)findViewById(R.id.result); 

außerhalb jeder Methode aufrufen, wird dazu führen, dass direkt im Konstruktor auszuführen, die nur Android-System ruft vor onCreate() auf Beispiel auf Aktivität aufruft. Was zu dieser Zeit Null zurückgibt. Später in onCreate() Methode setzen Sie den Inhalt anzeigen für diese Tätigkeit

setContentView(R.layout.activity_main);

Also bitte diese beiden Linien nach dem Aufruf setContentView() in onCreate() -Methode bewegen.

+0

wenn ich die obigen zwei Zeilen nach "setContentView (R.layout.activity_main);", Methoden press1 und press2 nicht erkennt btn und edittext. –

+0

Deklarieren Sie die Variablen als Klassenmitglieder 'Button mButton; EditText mEditText; ' und dann ordnen sie in onCreate() nach setContentView() ' mbutton = (Button) findViewById (R.id.button); mEditText = (EditText) findViewById (R.id.result); ' – apersiankite