My goal is to have an EditText
that has no fancy features, just the Text Selection Handler for moving the cursor more easily -- so no context menus or pop-ups.
I've disabled the appearance of the text editing function actionbar (copy/Paste etc.) by consuming the ActionMode Callback event, as per this solution.
The middle Middle Text Select Handle (see image below) still appears when text exists in the field and a click occurs within the text. Great! I want to keep this behaviour. What I DON'T want is the "PASTE" menu to appear when the Text Select Handle itself is clicked.
I have also disabled long-click input for the EditText by setting android:longClickable="false"
in the styles XML. Disabling the long click prevents the "Paste/Replace" menu from appearing when the mouse is clicked and held (i.e. long touch), however when the mouse is clicked (single touch) within the text, the text selection handle appears, and when the text selection handle itself is clicked, then the "paste" menu option appears (when there's text in the clipboard). This is what I'm trying to prevent.
From what I can see from the source, the ActionPopupWindow
is what pops up with the PASTE/REPLACE options. ActionPopupWindow is a protected variable (mActionPopupWindow) in the private abstract class HandleView within public class android.widget.Editor...
Short of disabling the clipboard service or editing the Android Source code, is there a way that I can prevent this from showing? I tried to define a new style for android:textSelectHandleWindowStyle
, and set android:visibility
to gone
, but it didn't work (app froze for a while when it would otherwise have shown).
I don't find a way to hide the menu popup , But you can disable from pasting if user tap on the menu
Create a custom
EditText
and override theonTextContextMenuItem
method and return false forandroid.R.id.paste
andandroid.R.id.pasteAsPlainText
menu id's.Found another solution when the blue view (insertion controller) is not appeared at all. I used reflection to set target boolean field of Editor class. Look at the android.widget.Editor and android.widget.TextView for more details.
Add the following code into your custom EditText (with all previous code in this topic):
Also, maybe you can find the better place than onTouch() to call the target method.
Tested on Android 5.1
Just override one method:
Solution: Override
isSuggestionsEnabled
andcanPaste
inEditText
.For the quick solution, copy the class below - this class overrides the
EditText
class, and blocks all events accordingly.For the gritty details, keep reading.
The solution lies in preventing PASTE/REPLACE menu from appearing in the
show()
method of the (non-documented)android.widget.Editor
class. Before the menu appears, a check is done toif (!canPaste && !canSuggest) return;
. The two methods that are used as the basis to set these variables are both in theEditText
class:isSuggestionsEnabled()
is public, and may thus be overridden.canPaste()
is not, and thus must be hidden by introducing a function of the same name in the derived class.So incorporating these updates into a class that also has the setCustomSelectionActionModeCallback, and the disabled long-click, here is the full class to prevent all editing (but still display the text selection handler) for controlling the cursor:
I've tested this in Android v4.4.2 and v4.4.3.
I found a simple yet reliable way. The idea is the consume away the touch event, to prevent the touch event reach underlining default code.
Note, blinking cursor is still showing at end of text. Just that the screenshot unable to capture it.
None of the above solutions worked for me. I've managed to do my solution (explanation after), which disabled pasting anything on the EditText while maintaining all other operations valid.
Mainly, you have to override this method on your implementation of EditText:
So investigating EditText code, after all checks, paste (and all
ContextMenu
actions on the EditText) happen at a method calledonTextContextMenuItem
:If you notice, pasting will only occur when
id == ID_PASTE
, so, again, looking at the EditText code: