2015-06-18 20 views
8

Ho riscontrato un problema in cui il mio pulsante (id i_am_a_problem) dichiarato nell'XML del layout del frammento genera un errore quando si fa clic sul pulsante. Android tenta di chiamare il metodo onClick public void calculate(View v) ma non riesce a trovarlo (nonostante sia dichiarato in MainActivity). I dettagli del mio codice sono sotto, e l'errore è dopo. Per favore aiutami a determinare perché Android non è in grado di trovare il metodo onClick. Grazie.Android non riesce a trovare il mio metodo onClick

Non c'è davvero niente altro in corso in questo codice (fresco nuovo progetto)

MainActivity.java

package supercali.FRAG.alistic; 

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

public class MainActivity extends AppCompatActivity { 

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


    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { /*snip - irrelevance*/ } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { /*snip - irrelevance*/ } 

    public void calculcate(View v){ 
     TextView tv = (TextView)findViewById(R.id.results); 
     tv.setText(calculate_value()); 
    } 

    private String calculate_value(){ 
     return "Abra Kadabra"; 
    } 
} 

il layout di MainActivity contiene solo un frammento

<fragment 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:id="@+id/fragment" 
    android:name="supercali.FRAG.alistic.MainActivityFragment" 
    tools:layout="@layout/fragment_main" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" /> 

E il layout per quello Frammento è:

<LinearLayout 
    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:paddingLeft="@dimen/activity_horizontal_margin" 
    android:paddingRight="@dimen/activity_horizontal_margin" 
    android:paddingTop="@dimen/activity_vertical_margin" 
    android:paddingBottom="@dimen/activity_vertical_margin" 
    tools:context=".MainActivityFragment"> 

    <Button 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="@string/calculate" 
     android:onClick="calculate" 
     android:id="@+id/i_am_a_problem"/> 

    <TextView android:text="@string/results_pending" android:layout_width="wrap_content" 
     android:layout_height="wrap_content" android:id="@+id/results"/> 

</LinearLayout> 

Il pulsante problema è proprio lì ^^ con id i_am_a_problem

LogCat:

06-18 09:49:41.280 31642-31642/supercali.FRAG.alistic E/AndroidRuntime﹕ FATAL EXCEPTION: main 
    Process: supercali.FRAG.alistic, PID: 31642 
    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 
      at android.view.View$DeclaredOnClickListener.resolveMethod(View.java:4441) 
      at android.view.View$DeclaredOnClickListener.onClick(View.java:4405) 
      at android.view.View.performClick(View.java:5147) 
      at android.view.View$PerformClick.run(View.java:21069) 
      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:5401) 
      at java.lang.reflect.Method.invoke(Native Method) 
      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:725) 
      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:615) 
+0

Forse il fatto che si trovi in ​​un 'FrameLayout' è il problema. Ad ogni modo, cerca di evitare XML 'onClick', e fallo per codice con' setOnClickListener() 'e vedi se funziona. – shkschneider

risposta

17

È errato il metodo. l'XML è alla ricerca di calcolare ma il metodo è calculcate

+0

Sì. Sapevo che era qualcosa di stupido. Ci ho pensato anche così tante volte. – Zerp

+0

Nel mio caso l'errore è che non stavo passando Visualizza oggetto nel metodo come calcolare (Vedi v) :) – Omama

+0

Non riesco a credere di aver passato più di 2 ore alle prese con un semplice controllo ortografico. Accidenti alla mia mente fissa. –

1

Scrivi il nome del metodo in modo corretto:

public void calculate(View v){ 
     TextView tv = (TextView)findViewById(R.id.results); 
     tv.setText(calculate_value()); 
    } 
3

Il tuo metodo onclick si chiama "calculcate" in attività. Nell'XML è "calcolare".

1

Basta sia ortografia sono diversi ....

<Button 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="@string/calculate" 
     android:onClick="calculcate" 
     android:id="@+id/i_am_a_problem"/> 

ho appena messo android: onClick = "calculcate" Mentre hai usato la parola "calculcate"

public void calculcate(View v){ 
..... 
} 

E si è utilizzato android:onClick="calculate"

2

Ho affrontato lo stesso errore ma il mio metodo onClick è stato sovrascritto dalla mia attività di base classe e quando lo sovrascrivo con editor aiuta la sua firma è diventata protetta e quindi era il problema.

Il problema è stato risolto quando l'ho reso pubblico.

1

Hai sbagliato a calcolare. E se ciò non funziona, prova View view invece di View v.

0

In realtà, nel file AndroidManifest verificare il nome corretto o meno. AndroidManifest viene visualizzato riga colore se il nome del file xml e il nome del file di classe non sono correlati.

Base sul problema, onClickListener non riesce a trovare i file di classe a causa di un nome errato. L'errore mostrerà solo l'errore di Onclick.Questo problema potrebbe confondere il fatto che potresti impostare l'errore onClickListener ma il problema reale è che hai impostato un nome errato nel file xml e nella classe di attività.

A volte, non vedrete l'errore nei file xml e attività a causa dello stesso nome Android. In questo caso puoi verificare facilmente cosa non ha funzionato nel file AndroidManifest.

Problemi correlati