web-dev-qa-db-fra.com

Vous avez tenté de terminer un événement d'entrée, mais le récepteur d'événements d'entrée a déjà été supprimé

J'ai un adaptateur personnalisé pour ma vue de liste. L'adaptateur contient une vue texte et un bouton image. J'ai mis en place un menu contextuel en cliquant sur le bouton image. Tout fonctionne bien. Mais lors de la sélection des options dans le menu contextuel, logcat affiche un message sur une seule ligne "Tentative de terminer un événement d'entrée mais le récepteur d'événements d'entrée a déjà été supprimé" et rien ne se passe.

public class MyAdapter extends ArrayAdapter<String> {

    public MyAdapter(Context context, int resourceId) {
        super(context, resourceId);
    }

    public MyAdapter(Context context, int resourceId, List<String> string) {
        super(context, resourceId, string);
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        View v = convertView;
        if(v == null) {
            LayoutInflater inflater = LayoutInflater.from(getContext());
            v = inflater.inflate(R.layout.adapter_layout, null);
        }

        String str = getItem(position);

        if(str != null) {
            TextView textView = (TextView)v.findViewById(R.id.editText1);
            textView.setText(str);
            ImageButton button = (ImageButton)v.findViewById(R.id.imageButton1);
            button.setOnClickListener(new Custom_Adapter_Button_Click_Listener(getItemId(position), getContext()));
        }

        return v;
    }
}

l'interface onclicklistener est

public class Custom_Adapter_Button_Click_Listener implements OnClickListener, OnMenuItemClickListener {

    long position;
    Context context;

    public Custom_Adapter_Button_Click_Listener(long id, Context appcontext) {
        position = id;
        context = appcontext;
    }



    @Override
    public boolean onMenuItemClick(MenuItem item) {
        AdapterContextMenuInfo info = (AdapterContextMenuInfo)item.getMenuInfo();
        int index = info.position;
        Log.d("ItemClicked", "selected index : " + index);
        switch(item.getItemId()) {
        case R.id.option :
            Toast.makeText(context, "Selected index : " + index, Toast.LENGTH_SHORT).show();
            return true;

        default :
            Toast.makeText(context, "Default", Toast.LENGTH_SHORT).show();
            return false;
        }
    }

    @Override
    public void onClick(View v) {
        PopupMenu popup = new PopupMenu(context, v);
        MenuInflater popupInflater = popup.getMenuInflater();
        popupInflater.inflate(R.menu.contextmenu, popup.getMenu());
        popup.show();   

    }

}

Ce que j'ai compris du message est que quelque chose mange l'événement avant que onMenuItemClick () ne soit exécuté. J'exécute mon application sur Nexus 5 Android 5.0.1.

Je trouve une solution pour un problème similaire de ici . Mais je ne sais pas comment utiliser cette approche pour mon problème.

J'ai essayé d'utiliser le menu contextuel au lieu du menu contextuel, mais j'ai toujours eu le même message "Tentative de terminer un événement d'entrée mais le récepteur d'événements d'entrée a déjà été supprimé" après avoir cliqué sur l'élément de menu contextuel.

Aidez-moi, s'il vous plaît...!!

24
Gopi

J'ai rencontré ce problème sous un autre angle; essayer de lancer un service à partir d'un menu. Par défaut, le message de débogage n'est pas trop pertinent. Ma solution a été d'éliminer les filtres dans logcat, puis j'ai reçu un autre message indiquant qu'il ne pouvait pas lancer le service en premier lieu (j'ai oublié de le mettre dans mon fichier manifeste).

Dans votre cas, vous devrez peut-être envelopper l'affichage du toast dans une classe:

public class DisplayToast implements Runnable {
    private final Context mContext;
    private final String mText;

    public DisplayToast(Context mContext, String text) {
        this.mContext = mContext;
        mText = text;
    }

    public void run() {
        Toast.makeText(mContext, mText, Toast.LENGTH_SHORT).show();
    }
}

et appelez-le via un objet Handler:

mHandler.post(new DisplayToast(this, "Epic message!"));

Ou, encore mieux, en utilisant la méthode Handler.postDelayed().

HTH,

5
Laur Ivan

Vous devez passer le R.layout.id dans le super () pour éviter cette erreur. Par exemple:

public PersonAdapter(Context c, ArrayList<String> list) {
            super(c, R.layout.item_layout, list);
}
0
Deplover