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)
Vous avez mal orthographié la méthode . Le XML recherche calcule mais votre méthode est calculcate
Votre méthode onCLick s'appelle "calculcate" dans l'activité. Dans le XML, c'est "calculer".
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.
Écrivez le nom de la méthode correctement:
public void calculate(View v){
TextView tv = (TextView)findViewById(R.id.results);
tv.setText(calculate_value());
}
Vous avez mal orthographié, calculez. Et si cela ne fonctionne pas, essayez View View au lieu de View v.
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"
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.