2014-12-21 22 views
21

Mam niestandardowy adapter dla mojego widoku listy. Adapter zawiera widok tekstowy i przycisk obrazu. Zaimplementowałem menu podręczne po kliknięciu przycisku obrazu. Wszystko działa dobrze. Ale po wybraniu opcji z menu podręcznego logcat wyświetla komunikat "Próbowano zakończyć zdarzenie wejściowe, ale odbiornik zdarzeń wejściowych już został usunięty" i nic się nie dzieje.Próba zakończenia zdarzenia wejściowego, ale odbiornik zdarzeń wejściowych został już usunięty.

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 interfejsu jest

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

    } 

} 

Co zrozumiałem z wiadomości jest to, że niektóre rzeczą jest jedzenie zdarzenie przed onMenuItemClick() pobiera wykonania. Używam mojej aplikacji na Android 5.0.1 nexus 5.

Znajduję rozwiązanie dla podobnego problemu od here. Ale nie mam sposobu, aby wykorzystać to podejście do mojego problemu.

Próbowałem używać menu kontekstowego zamiast menu podręcznego, ale wciąż miałem ten sam komunikat "Próba zakończenia zdarzenia wejściowego, ale odbiornik zdarzeń wejściowych już został usunięty" po kliknięciu pozycji menu kontekstowego.

Proszę, pomóżcie mi ... !!

+3

mam ten komunikat o błędzie w następującym scenariuszu: aktywny tworzy dialogowe. Dialogowi przypisano KeyListener. Przycisk Wstecz jest wciśnięty, a okno dialogowe Aktywność + jest zamknięte. Wygląda na to, że okno dialogowe jest zamknięte przed zakończeniem "zdarzenia wejściowego". – Pawel

Odpowiedz

5

Uderzyłem ten problem pod innym kątem; próbuje uruchomić usługę z menu. Domyślnie komunikat debugowania nie jest zbyt istotny. Moim rozwiązaniem było wyeliminowanie filtrów w logcat, a następnie dostałem kolejną wiadomość, że nie może uruchomić usługi w pierwszej kolejności (zapomniałem umieścić go w moim pliku manifestu).

W twoim przypadku może być konieczne, by zakończyć wyświetlanie tosty do klasy:

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

i nazywają to poprzez Handler obiektu:

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

Albo, jeszcze lepiej, stosując Handler.postDelayed() metody .

HTH,

+0

Jak "wyeliminować filtry w logcat"? – Kidburla

+0

@Kidburla, W AS, w "Android Monitor", wybierz "Bez filtrów" zamiast "Pokaż tylko wybraną aplikację". –