长按后 EditText 不显示默认的 ContextMenu

Posted

技术标签:

【中文标题】长按后 EditText 不显示默认的 ContextMenu【英文标题】:EditText not showing default ContextMenu after long press 【发布时间】:2014-12-27 07:28:32 【问题描述】:

长按后,我的 EditText 不显示默认的 ContextMenu(复制、粘贴、选择、全选)。我必须创建自己的 ContextMenu 吗?

下面是来自一个函数的 sn-ps,该函数被调用以创建此 EditText 所在的弹出菜单。

LayoutInflater layoutInflater = (LayoutInflater) getBaseContext().getSystemService(LAYOUT_INFLATER_SERVICE);
    popupView = layoutInflater.inflate(R.layout.add_recipe_pop,null);
    final PopupWindow popupWindow = new PopupWindow(popupView,LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT);
    EditText recipe_url = (EditText)popupView.findViewById(R.id.recipe_url_text);
    recipe_url.setLongClickable(true);
    registerForContextMenu(recipe_url);
    popupWindow.setFocusable(true);
    popupWindow.update();
    popupWindow.showAtLocation(v,Gravity.CENTER,0,0);

这是 add_recipe_pop XML 的一部分,而 EditText 只是在一个

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_
    android:layout_
    android:background="#E6E6E6"
    android:orientation="vertical" >

<EditText
     android:id="@+id/recipe_url_text"
     android:layout_
     android:layout_
     android:hint="@string/add_recipe_hint"
     android:inputType="textUri"
   />

我尝试过使用 EditText 可聚焦和 setTextSelectable 属性,但如果我这样做,键盘不会出现。感谢您的帮助! :)

【问题讨论】:

该功能称为剪贴板,请查看此链接。 ***.com/questions/25580288/… 使用 setfocusableintouchmode.. 不,您不必创建自己的上下文菜单,是设备默认设置.. 并删除 recipe_url.setLongClickable(true); registerForContextMenu(recipe_url); @Elltz 我尝试使用recipe_url.setFocusableInTouchMode(true);但上下文菜单仍然没有出现:/ @balajikoduri 我试过这样做,它有效,但它只允许我粘贴或复制,但我希望能够执行所有功能(复制、粘贴、选择、全选) 【参考方案1】:

这是旧的,但对于任何看到这个的人,我发现没有办法解决这个问题。

由于某种原因,弹出窗口中的任何编辑文本都可以使用,但不能与复制/粘贴菜单一起使用。

实际上你可以设置任何文本可选,但它不会起作用。

解决此问题的最简单方法就是不使用弹出菜单。如果您更改代码以将内容视图设置为弹出菜单布局,它将起作用。

为什么它在弹出菜单中不起作用我不知道,但不使用菜单是有效的。

【讨论】:

【参考方案2】:
LayoutInflater layoutInflater = (LayoutInflater) getBaseContext().getSystemService(LAYOUT_INFLATER_SERVICE);
popupView = layoutInflater.inflate(R.layout.add_recipe_pop,null);
final PopupWindow popupWindow = new PopupWindow(popupView,LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT);
EditText recipe_url = (EditText)popupView.findViewById(R.id.recipe_url_text);
popupWindow.update();
popupWindow.showAtLocation(v,Gravity.CENTER,0,0);

xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_
android:layout_
android:background="#E6E6E6"
android:focusable="true"   // toggle this when testing
android:orientation="vertical" >

<EditText
 android:id="@+id/recipe_url_text"
 android:layout_
 android:layout_
 android:hint="@string/add_recipe_hint"
 android:focusable="true"
 android:focusableInTouchMode="true"
 android:inputType="textUri"
/>

这应该有效..让我知道它是否有效,所以我给出我的理由..

【讨论】:

它不起作用:/ 我尝试在线性布局中切换可聚焦,但没有任何效果,如果我取出 popupWindow.setFocusable(true),那么我看不到键盘和上下文菜单仍然没有出现。您认为在 popupWindow 中为这些按钮设置额外的按钮和点击侦听器会影响它吗?因为我有 2 个带有监听器的按钮... 是的,我的想法是,让焦点远离视图组,所以当您在软输入键盘弹出之前单击编辑文本时,我也不认为听众会阻止这种情况..@贾斯汀坦 哦..不..我试试一个可行的样本并将其发送给你这里,所以,是的@JustinTan 嘿@Elltz,我做了更多的挖掘,我认为这只是Android中的一个错误。感谢您的所有帮助,但我想我会以其他方式实现它(可能是一个对话框)。【参考方案3】:

这个问题的关键在于setText()时,必须在Window中添加EditText才能支持选择。

这是关键源代码:Editor.prepareCursorControllers()

void prepareCursorControllers() 
    boolean windowSupportsHandles = false;

    ViewGroup.LayoutParams params = mTextView.getRootView().getLayoutParams();
    // If mTextView is not added to the window, params will be normal LayoutParams(FrameLayout.LayoutParams/LinearLayout.LayoutParams ect.)
    if (params instanceof WindowManager.LayoutParams) 
        WindowManager.LayoutParams windowParams = (WindowManager.LayoutParams) params;
        windowSupportsHandles = windowParams.type < WindowManager.LayoutParams.FIRST_SUB_WINDOW
                || windowParams.type > WindowManager.LayoutParams.LAST_SUB_WINDOW;
    

    boolean enabled = windowSupportsHandles && mTextView.getLayout() != null;
    mInsertionControllerEnabled = enabled && isCursorVisible();
    mSelectionControllerEnabled = enabled && mTextView.textCanBeSelected();
    /// ...

【讨论】:

以上是关于长按后 EditText 不显示默认的 ContextMenu的主要内容,如果未能解决你的问题,请参考以下文章

长按后Swift UiTableViewCell重置

长按后选择复制图像时,swift uitextview html图像会导致崩溃

长按后抬起手指时iOS中没有Javascript事件?

长按后如何禁用 UICollectionViewCell 上的 UILongPressGestureRecognizer?

长按时像 iMessage 一样突出显示 UITableViewCell

Android的EditText长按只显示上面的复制粘贴菜单,不要弹出下面的输入法键盘怎么做?