长按后,EditText不显示默认的ContextMenu

时间:2014-12-27 07:28:33

标签: android android-edittext contextmenu

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

以下是来自函数的片段,该函数被调用以创建此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_width="wrap_content"
    android:layout_height="wrap_content"
    android:background="#E6E6E6"
    android:orientation="vertical" >

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

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

3 个答案:

答案 0 :(得分:0)

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_width="wrap_content"
android:layout_height="wrap_content"
android:background="#E6E6E6"
android:focusable="true"   // toggle this when testing
android:orientation="vertical" >

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

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

答案 1 :(得分:0)

这已经过时了但是对于任何看过这个的人我都发现没有办法解决这个问题。

由于某些原因,弹出窗口内的任何编辑文本都可以使用,但无法使用复制/粘贴菜单。

事实上,你可以设置任何可选的文字,但它不起作用。

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

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

答案 2 :(得分:0)

此问题的关键在于,当使用setText()时,必须将EditText添加到Window中以支持选择。

这是关键源代码: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();
    /// ...
}