通过从TextView派生自定义视图并监听长按事件来解决此问题。以下是示例代码:
public class CustomTextView extends TextView { private static final int CUSTOM_MENU_ID = View.generateViewId();
public CustomTextView(Context context) {
super(context);
}
public CustomTextView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public CustomTextView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
@Override
public boolean performLongClick() {
// 显示自定义的长按菜单
final PopupMenu popup = new PopupMenu(getContext(), this);
popup.getMenu().add(Menu.NONE, CUSTOM_MENU_ID, Menu.NONE, "自定义菜单项");
popup.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem item) {
if (item.getItemId() == CUSTOM_MENU_ID) {
// 处理自定义菜单项的点击事件
return true;
}
return false;
}
});
popup.show();
return true;
}
}
在Activity或Fragment中,使用CustomTextView替换TextView并设置触摸监听器:
CustomTextView textView = new CustomTextView(this); textView.setOnLongClickListener(new View.OnLongClickListener() { @Override public boolean onLongClick(View view) { // 必须返回true才能取消TextView的默认长按事件, // 否则会同时显示默认菜单和自定义菜单。 return true; } }); // 将CustomTextView添加到布局中 container.addView(textView);