Весь смысл контекстного меню заключается в том, что оно связано с отдельным базовым представлением, и в Android явно заложено ограничение дизайна, так как ассоциация теряется при обратном вызове onContextItemSelected. Включение долгого касания в любом представлении достаточного размера кажется вполне разумным в качестве альтернативы щелчку правой кнопкой мыши.
Как рекомендовали другие посты, для некоторых контекстов:
AdapterView.AdapterContextMenuInfo menuInfo =
(AdapterView.AdapterContextMenuInfo)item.getMenuInfo();
подходят и targetView является полезной точкой отсчета.
Другим способом является создание подкласса представления и переопределение getContextMenuInfo для предоставления ссылки на представление. Например, простой TextView:
package ...;
public class TextViewWithContext extends TextView {
TextViewContextMenuInfo _contextMenuInfo = null;
public TextViewWithContext(Context context) {
super(context);
_contextMenuInfo = new TextViewContextMenuInfo(this);
}
public TextViewWithContext(Context context, AttributeSet attrs) {
super(context, attrs);
_contextMenuInfo = new TextViewContextMenuInfo(this);
}
protected ContextMenuInfo getContextMenuInfo() {
return _contextMenuInfo;
}
public boolean isContextView(ContextMenuInfo menuInfo) {
return menuInfo == (ContextMenuInfo)_contextMenuInfo;
}
protected class TextViewContextMenuInfo implements ContextMenuInfo {
protected TextView _textView = null;
protected TextViewContextMenuInfo(TextView textView) {
_textView = textView;
}
}
}
...
@Override
public boolean onContextItemSelected(MenuItem item) {
ContextMenuInfo menuInfo = item.getMenuInfo();
if (textViewWithContext.isContextView(menuInfo) {
...
}
}
Наконец, было бы более полезно, если бы базовый класс View назначил объект ContextInfo с обратной ссылкой на представление, а не ноль, как в настоящее время.