web-dev-qa-db-fra.com

Android incapable de trouver ma méthode onClick

J'ai un problème où mon bouton (id i_am_a_problem), déclaré dans le XML de présentation du fragment, génère une erreur lorsque l'utilisateur clique sur le bouton. Android tente d'appeler la méthode onClick public void calculate(View v) mais ne parvient pas à la trouver (bien qu'elle ait été déclarée dans MainActivity). Les détails de mon code sont ci-dessous, et l'erreur est après cela. S'il vous plaît aidez-moi à déterminer pourquoi Android est incapable de trouver la méthode onClick. Merci.

Il n'y a vraiment rien d'autre dans ce code (nouveau projet)

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";
    }
}

La mise en page de MainActivity ne contient qu'un fragment

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

Et la mise en page de ce fragment est:

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

Le problème bouton est juste là ^^ avec 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)
8
Zerp

Vous avez mal orthographié la méthode . Le XML recherche calcule mais votre méthode est calculcate

17
EE66

Votre méthode onCLick s'appelle "calculcate" dans l'activité. Dans le XML, c'est "calculer".

3
user4989692

J'ai rencontré la même erreur, mais ma méthode onClick a été remplacée par ma classe d'activité de base et lorsque je l'ai remplacée avec l'aide de l'éditeur, sa signature est devenue protégée et le problème était donc résolu. 

Le problème a été résolu quand je l'ai rendu public.

2
Deepali Maniyar

Écrivez le nom de la méthode correctement:

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

Vous avez mal orthographié, calculez. Et si cela ne fonctionne pas, essayez View View au lieu de View v.

1
Carter Ray

Juste les deux orthographes sont différentes ....

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

Je viens de mettre Android: onClick = "calculcate" Pendant que vous utilisiez Word "calculcate"

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

Et vous avez utilisé Android:onClick="calculate"

1
Kush

En fait, dans le fichier AndroidManifest pour vérifier si le nom est correct ou non. AndroidManifest affiche la ligne de couleur de lecture si le nom de fichier xml et le nom de fichier de classe ne sont pas liés.

Sur la base du problème, onClickListener ne peut pas trouver vos fichiers de classe à cause d'un nom incorrect. Erreur ne montrera que l'erreur Onclick. Ce problème peut confondre le fait que vous pouvez définir une valeur incorrecte onClickListener, mais le problème réel est que vous définissez un nom incorrect dans le fichier xml et la classe d'activité.

Parfois, vous ne verrez pas d'erreur dans les fichiers XML et d'activité en raison du même nom Android. Dans ce cas, vous pouvez facilement vérifier ce qui ne va pas dans le fichier AndroidManifest.

0
Neon