2014-12-21 7 views
21

Ich habe einen benutzerdefinierten Adapter für meine Listenansicht. Der Adapter enthält eine Textansicht und eine Bildschaltfläche. Ich habe ein Popup-Menü beim Klicken auf die Bildschaltfläche implementiert. Alles funktioniert gut. Aber wenn man die Optionen aus dem Popup-Menü auswählt, zeigt logcat eine einzeilige Nachricht an "Es wurde versucht, ein Eingabe-Ereignis zu beenden, aber der Eingabe-Ereignis-Empfänger wurde bereits entfernt" und nichts passiert.Es wurde versucht, ein Eingabeereignis zu beenden, aber der Eingabeereignisempfänger wurde bereits entfernt

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

OnClickListener Schnittstelle ist

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(); 

    } 

} 

Was ich von der Botschaft verstanden, dass etwas, was das Ereignis vor onMenuItemClick isst() wird ausgeführt werden. Ich benutze meine App auf Nexus 5 Android 5.0.1.

Ich finde eine Lösung für ähnliche Art von Problem von here. Aber ich verstehe nicht, wie ich diesen Ansatz für mein Problem anwenden kann.

Ich versuchte mit dem Kontextmenü statt Popup-Menü, aber immer noch hatte ich die gleiche Meldung "Versuch, ein Eingabeereignis zu beenden, aber Eingang Ereignis Empfänger wurde bereits entsorgt" nach dem Klicken auf den Kontextmenüpunkt.

Bitte helfen Sie mir ... !!

+3

Ich habe diese Fehlermeldung in dem folgende Szenario: Aktivität einen Dialog erzeugt. Dem Dialog ist ein KeyListener zugewiesen. Zurück Schaltfläche wird gedrückt und der Aktivitäts + Dialog wird geschlossen. Anscheinend wird der Dialog geschlossen, bevor das "Eingabe-Ereignis" beendet ist. – Pawel

Antwort

5

Ich habe dieses Problem aus einem anderen Blickwinkel getroffen; versuchen, einen Dienst über ein Menü zu starten. Standardmäßig ist die Debug-Nachricht nicht relevant. Meine Lösung war, Filter in logcat zu entfernen und dann bekam ich eine andere Nachricht, dass es den Dienst überhaupt nicht starten konnte (ich habe vergessen, es in meine Manifest-Datei zu legen).

In Ihrem Fall müssen Sie den Toast-Display in eine Klasse wickeln:

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(); 
    } 
} 

und nennen es über ein Handler Objekt:

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

Oder noch besser, mit Handler.postDelayed() Verfahren .

HTH,

+0

Wie "Filter in Logcat zu beseitigen"? – Kidburla

+0

@Kidburla, In AS, auf dem "Android Monitor", wählen Sie "Keine Filter" statt "Nur ausgewählte Anwendung anzeigen". –

Verwandte Themen