web-dev-qa-db-fra.com

java.lang.illegalstateexception n'a pas trouvé de méthode (vue) dans le fragment de classe d'activité Android

dans mon programme, j'utilise un gridview avec certaines images, je veux afficher un menu lorsque l'utilisateur appuie sur une image dans gridview, puis sélectionnez une action à faire dans le menu affiché.

voici mes codes:

package Kazemi.Alireza.scada;
import Android.annotation.SuppressLint;
import Android.app.Dialog;
import Android.app.FragmentManager;
import Android.content.Context;
import Android.graphics.Typeface;
import Android.graphics.drawable.AnimationDrawable;
import Android.os.Bundle;
import Android.support.v4.app.Fragment;
import Android.view.ContextMenu;
import Android.view.ContextMenu.ContextMenuInfo;
import Android.view.Gravity;
import Android.view.LayoutInflater;
import Android.view.Menu;
import Android.view.MenuItem;
import Android.view.View;
import Android.view.ViewGroup;
import Android.view.WindowManager;
import Android.view.ViewGroup.LayoutParams;
import Android.widget.AdapterView;
import Android.widget.AdapterView.AdapterContextMenuInfo;
import Android.widget.BaseAdapter;
import Android.widget.Button;
import Android.widget.GridView;
import Android.widget.ImageView;
import Android.widget.LinearLayout;
import Android.widget.PopupWindow;
import Android.widget.TextView;
import Android.widget.Toast;
import Android.widget.AdapterView.OnItemClickListener;


@SuppressLint("NewApi")
public class CitiesTab extends Fragment {

AnimationDrawable[] frameAnimation;
ImageAdapter ia;
GridView gridView;
int in;

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    return (LinearLayout)inflater.inflate(R.layout.citytab, container, false);
}

public void onStart()
{
    super.onStart();
    ia = new ImageAdapter(getActivity());
    gridView = (GridView) getActivity().findViewById(R.id.gridview);
    gridView.setAdapter(ia);
    gridView.post(new Starter());
    gridView.setOnItemClickListener(new OnItemClickListener()
    {
        public void onItemClick(AdapterView<?> parent, View v, int position, long id)
        {
            dialog = new Dialog(getActivity(), Android.R.style.Theme_InputMethod);
            dialog.setContentView(R.layout.pump_menu);
        }});
    /*Button btn = (Button) getActivity().findViewById(R.id.Button_pumpInfo);
    btn.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            Toast.makeText(getActivity(), "You clicked on Item 1",
                    Toast.LENGTH_LONG).show();
        }
    });*/
}

public void Btn_pumpInfo_Clicked(View v) {
    // TODO Auto-generated method stub
    Toast.makeText(getActivity(), "You clicked on Item 1",
            Toast.LENGTH_LONG).show();
}

}

voici mon code pump_menu.xml:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:layout_width="fill_parent"
    Android:layout_height="fill_parent"
    Android:background="#a5c5f0"
    Android:orientation="vertical" >

<Button 
    Android:id="@+id/Button_pumpInfo" 
    Android:layout_height="40dp" 
    Android:text="@string/menu_pumpinfo_item1"
    Android:textSize="11sp" 
    Android:layout_width="125dp"
    Android:background="#a5c5f0"
    Android:onClick="Btn_pumpInfo_Clicked"/>

et citytab.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:layout_width="fill_parent"
    Android:layout_height="fill_parent"
    Android:orientation="vertical" >

<GridView 
    Android:id="@+id/gridview"
    Android:layout_width="fill_parent" 
    Android:layout_height="fill_parent"
    Android:numColumns="auto_fit"
    Android:verticalSpacing="10dp"
    Android:horizontalSpacing="10dp"
    Android:columnWidth="90dp"
    Android:stretchMode="columnWidth"
    Android:gravity="center" />

<ImageView 
    Android:id="@+id/gifViewer"
    Android:layout_width="wrap_content"
    Android:layout_height="wrap_content"
    Android:scaleType="center"/>

</LinearLayout>

quand j'utilise ce code, une erreur est survenue:

Java.lang.RuntimeException: Unable to start activity ComponentInfo{Kazemi.Alireza.scada/Kazemi.Alireza.scada.MainMenu}: Java.lang.NullPointerException

et quand je commente la méthode Btn_pumpInfo_Clicked (), et commente l'écouteur de bouton dans onStart (), l'erreur suivante se produit:

Java.lang.IllegalStateException: Could not find a method Btn_pumpInfo_Clicked(View) in the activity class Android.view.ContextThemeWrapper for onClick handler on view class Android.widget.Button with id 'Button_pumpInfo'

où est le problème? Merci

17
user1793700

Vous ne pouvez pas enregistrer le rappel onClick (à l'aide de Android:onClick) pour Button (à partir de la présentation de Dialog) dans la classe Fragment car Android ne le trouvera pas car il recherchera seulement le Activity pour une méthode (Btn_pumpInfo_Clicked) et il lève cette exception. Recherchez plutôt la Button dans la Dialog et affectez-lui un écouteur normal:

//...
dialog.setContentView(R.layout.pump_menu)
Button b = (Button) dialog.findViewById(R.id.Button_pumpInfo);
b.setOnClickListener(new OnClickListener() {

   @Override
   public void onCLick(View v) {
       // profit
   }
});

Ou déplacez la méthode:

public void Btn_pumpInfo_Clicked(View v) {
    // TODO Auto-generated method stub
    Toast.makeText(getActivity(), "You clicked on Item 1",
            Toast.LENGTH_LONG).show();
}

dans la classe Activity si cela vous convient.

42
Luksprog

Si ce bogue ne se produit que sur Android 2.x vérifiez la hiérarchie de votre classe d'activité pour les membres de classe spécifiques à Android 4: 

public class HomeActivity extends Activity {

  private Android.app.ActionBar.LayoutParams customTitleParams;

  ....
}

La classe Android.app.ActionBar.LayoutParams n'est pas disponible sur Android 2.x et cela peut causer le problème. 

3
peceps

Cela peut également se produire lorsque la méthode d'appel sur onClick de la vue (bouton) n'est pas accessible ou n'est pas disponible dans l'activité correspondante .

  • Vérifiez le nom de la méthode dans la valeur pour Android: l'attribut onClick correspond à la méthode réellement écrite.
  • Vérifiez que le modificateur d'accès de la méthode est public afin d'être disponible pour le Execute.
0
EffyCoder