2014-12-21 11 views
21

Ho un adattatore personalizzato per il mio listview. L'adattatore contiene una vista testuale e un pulsante immagine. Ho implementato un menu popup cliccando sul pulsante dell'immagine. Tutto funziona bene. Ma quando si selezionano le opzioni dal menu popup, logcat visualizza un messaggio a riga singola "Tentativo di terminare un evento di input ma il ricevitore di eventi in ingresso è già stato eliminato" e non accade nulla.Tentativo di terminare un evento di input ma il ricevitore di eventi in ingresso è già stato disposto

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

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

    } 

} 

Quello che ho capito dal messaggio è che qualche cosa sta mangiando l'evento prima onMenuItemClick() viene eseguito. Sto facendo funzionare la mia app su Android 5.0 di nexus 5.

Trovo una soluzione per questo tipo di problema da here. Ma non sto ottenendo come usare questo approccio al mio problema.

Ho provato a utilizzare il menu di scelta rapida invece del menu popup, ma ho ancora lo stesso messaggio "Tentativo di terminare un evento di input ma il destinatario dell'evento in ingresso è già stato eliminato" dopo aver fatto clic sulla voce del menu di scelta rapida.

Per favore aiutatemi ... !!

+3

ho questo messaggio di errore nel seguente scenario: attività crea una finestra di dialogo. La finestra di dialogo è assegnata a KeyListener. Il pulsante Indietro viene premuto e la finestra di dialogo Attività + viene chiusa. Apparentemente, la finestra di dialogo viene chiusa prima che "l'evento di input" sia terminato. – Pawel

risposta

5

Ho riscontrato questo problema da un'altra angolazione; cercando di avviare un servizio da un menu. Per impostazione predefinita, il messaggio di debug non è troppo rilevante. La mia soluzione era eliminare i filtri in logcat e poi ho ricevuto un altro messaggio che non poteva avviare il servizio in primo luogo (ho dimenticato di inserirlo nel mio file manifest).

Nel tuo caso, potrebbe essere necessario avvolgere il display brindisi in una 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(); 
    } 
} 

e chiamare tramite un oggetto Handler:

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

O, meglio ancora, utilizzando Handler.postDelayed() metodo .

HTH,

+0

Come "eliminare i filtri in logcat"? – Kidburla

+0

@Kidburla, in AS, sul "Monitor Android", si seleziona "Nessun filtro" invece di "Mostra solo l'applicazione selezionata". –