Попытка закончить входное событие, но входной приемник событий уже был удален
У меня есть пользовательский адаптер для моего списка. Адаптер содержит текстовое изображение и кнопку изображения. Во время щелчка по кнопке изображения я реализовал всплывающее меню. Все работает нормально. Но при выборе параметров из всплывающего меню 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.
Я нашел решение для аналогичной проблемы из здесь. Но я не понимаю, как использовать этот подход для моей проблемы.
Я попытался использовать контекстное меню вместо всплывающего меню, но все же у меня было то же сообщение "Попытка закончить входное событие, но входной приемник событий уже был удален" после нажатия на пункт контекстного меню.
Пожалуйста, помогите мне...!!
Ответы
Ответ 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);
}