Подтвердить что ты не робот

Попытка закончить входное событие, но входной приемник событий уже был удален

У меня есть пользовательский адаптер для моего списка. Адаптер содержит текстовое изображение и кнопку изображения. Во время щелчка по кнопке изображения я реализовал всплывающее меню. Все работает нормально. Но при выборе параметров из всплывающего меню logcat отображает одностровое сообщение "Попытка закончить входное событие, но входной приемник событий уже удален", и ничего не происходит.

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

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

    }

}

Что я понял из сообщения, так это то, что какая-то вещь есть событие, прежде чем onMenuItemClick() получит выполнение. Я запускаю свое приложение на nexus 5 android 5.0.1.

Я нашел решение для аналогичной проблемы из здесь. Но я не понимаю, как использовать этот подход для моей проблемы.

Я попытался использовать контекстное меню вместо всплывающего меню, но все же у меня было то же сообщение "Попытка закончить входное событие, но входной приемник событий уже был удален" после нажатия на пункт контекстного меню.

Пожалуйста, помогите мне...!!

4b9b3361

Ответ 1

Я ударил эту проблему под другим углом; пытаясь запустить службу из меню. По умолчанию отладочное сообщение не слишком актуально. Мое решение состояло в том, чтобы исключить фильтры в logcat, а затем я получил другое сообщение о том, что он не смог запустить службу в первую очередь (я забыл поместить ее в файл манифеста).

В вашем случае вам может потребоваться обернуть отображение тоста в класс:

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

и назовите его с помощью объекта Handler:

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

Или, что еще лучше, используя метод Handler.postDelayed().

НТН,

Ответ 2

Вы должны передать R.layout.id в super(), чтобы предотвратить эту ошибку. Например:

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