So deaktivieren Sie das Kopieren / Einfügen von / nach EditText

130

In meiner Anwendung gibt es einen Registrierungsbildschirm, in dem ich nicht möchte, dass der Benutzer Text in das EditTextFeld kopieren / einfügen kann . Ich habe onLongClickListenerjeweils ein festgelegt, EditTextdamit das Kontextmenü mit den Methoden Kopieren / Einfügen / Eingabemethode und anderen Optionen nicht angezeigt wird. Der Benutzer kann also nicht in die Bearbeitungsfelder kopieren / einfügen.

 OnLongClickListener mOnLongClickListener = new OnLongClickListener() {

        @Override
        public boolean onLongClick(View v) {
            // prevent context menu from being popped up, so that user
            // cannot copy/paste from/into any EditText fields.
            return true;
        }
    };

Das Problem tritt jedoch auf, wenn der Benutzer eine andere Tastatur eines Drittanbieters als die Android-Standardeinstellung aktiviert hat, die möglicherweise über eine Schaltfläche zum Kopieren / Einfügen verfügt oder dasselbe Kontextmenü anzeigt. Wie deaktiviere ich das Kopieren / Einfügen in diesem Szenario?

Bitte lassen Sie mich wissen, ob es auch andere Möglichkeiten zum Kopieren / Einfügen gibt. (und möglicherweise, wie man sie deaktiviert)

Jede Hilfe wäre dankbar.

rDroid
quelle
Wenn die "Einfüge" -Operation von einem IME stammt, haben Sie keine Standardmethode, um sie von normalen Tastenanschlägen zu unterscheiden. Eine Idee, die Sie versuchen sollten, besteht darin, die Zeit zwischen der Ankunft jedes Zeichens zu messen. Wenn die Zeit zu kurz ist, stammen die Zeichen aus einer "Einfüge" -Operation.
BitBank
scheint schmutzige Lösung zu sein! einen Blick wert.
Droroid
1
benutze android: longClickable = "false"
Azay Gupta

Antworten:

112

Wenn Sie API Level 11 oder höher verwenden, können Sie verhindern, dass Kopier-, Einfüge-, Ausschneide- und benutzerdefinierte Kontextmenüs angezeigt werden.

edittext.setCustomSelectionActionModeCallback(new ActionMode.Callback() {

            public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
                return false;
            }

            public void onDestroyActionMode(ActionMode mode) {                  
            }

            public boolean onCreateActionMode(ActionMode mode, Menu menu) {
                return false;
            }

            public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
                return false;
            }
        });

Wenn Sie im onCreateActionMode (ActionMode, Menü) false zurückgeben, wird der Aktionsmodus nicht gestartet (Alle auswählen, Ausschneiden, Kopieren und Einfügen).

Zain Ali
quelle
1
Was ist mit API-Level unter 13?
Jonathan
1
Verstehe keine der Kommentare, dieses Beispiel funktioniert api11 +, vor api11 gab es kein Kopieren und Einfügen IIRC
scottyab
28
Funktioniert bei mir nicht. Die Schaltfläche Einfügen wird angezeigt, wenn Sie auf die blaue Cursoranzeige tippen.
nichtig
8
Arbeitet auch nicht für mich. Bei zweimaligem Tippen wird das Menü zum Kopieren und Einfügen angezeigt.
Android Killer
Dies funktioniert nicht mehr auf Android 6.0, überprüfen Sie diese Antwort stackoverflow.com/questions/27869983/…
has19
131

Die beste Methode ist:

etUsername.setLongClickable(false);
Vicky Kapadia
quelle
58
Oder einfach in XML android:longClickable="false":)
Lomza
19
Die Schaltfläche Einfügen wird angezeigt, wenn Sie auf die blaue Cursoranzeige tippen.
nichtig
16
Dies verhindert sicherlich, dass die Ansicht lange anklickbar ist. Die Bearbeitungssteuerelemente können jedoch auch durch zweimaliges Tippen auf Text angefordert werden, was bedeutet, dass diese Lösung nicht vollständig ist. Denken Sie daran für Ihre Zwecke.
Kevin Grant
1
Außerdem könnten Tastaturkürzel mit externen Tastaturen weiterhin funktionieren (Strg + C).
Oleg Vaskevich
Dies funktioniert bei Ice Cream Sandwich nicht, da die Optionen in der Zwischenablage durch doppeltes Tippen auf Text sowie durch langes Tippen geöffnet werden können.
Paul Wintz
44

Sie können dies tun, indem Sie das lange Drücken des EditText deaktivieren

Um es zu implementieren, fügen Sie einfach die folgende Zeile in die XML ein -

android:longClickable="false"
Ameya Pandilwar
quelle
6
Problem war, dass mein App-Benutzer eine Tastatur eines Drittanbieters hat, die eine Schaltfläche zum Kopieren und Einfügen hat.
Droroid
3
Ein weiteres Problem ist, dass Sie den Text durch zweimaliges Tippen auswählen können und er erneut Kopieren / Einfügen anzeigt
Nikola
37

Ich kann die Funktion zum Kopieren und Einfügen folgendermaßen deaktivieren:

textField.setCustomSelectionActionModeCallback(new ActionMode.Callback() {

    public boolean onCreateActionMode(ActionMode actionMode, Menu menu) {
        return false;
    }

    public boolean onPrepareActionMode(ActionMode actionMode, Menu menu) {
        return false;
    }

    public boolean onActionItemClicked(ActionMode actionMode, MenuItem item) {
        return false;
    }

    public void onDestroyActionMode(ActionMode actionMode) {
    }
});

textField.setLongClickable(false);
textField.setTextIsSelectable(false);

Hoffe es funktioniert bei dir ;-)

Joseph Johnson
quelle
Dies ist genau die gleiche Lösung, die ich aufgrund der anderen obigen Antworten erhalten habe. Dies sollte als die richtige Lösung markiert werden, da es die Randfälle behandelt, die die anderen nicht behandeln
Andrew Hoefling
2
Diese Option blockiert die Kopie, Sie können sie jedoch weiterhin einfügen, indem Sie auf den Cursor klicken.
Mehul Kanzariya
12

Hier ist der beste Weg, um das Ausschneiden, Kopieren und Einfügen von editText in allen Versionen zu deaktivieren

if (android.os.Build.VERSION.SDK_INT < 11) {
        editText.setOnCreateContextMenuListener(new OnCreateContextMenuListener() {

            @Override
            public void onCreateContextMenu(ContextMenu menu, View v,
                    ContextMenuInfo menuInfo) {
                // TODO Auto-generated method stub
                menu.clear();
            }
        });
    } else {
        editText.setCustomSelectionActionModeCallback(new ActionMode.Callback() {

            public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
                // TODO Auto-generated method stub
                return false;
            }

            public void onDestroyActionMode(ActionMode mode) {
                // TODO Auto-generated method stub

            }

            public boolean onCreateActionMode(ActionMode mode, Menu menu) {
                // TODO Auto-generated method stub
                return false;
            }

            public boolean onActionItemClicked(ActionMode mode,
                    MenuItem item) {
                // TODO Auto-generated method stub
                return false;
            }
        });
    }
Hardik
quelle
Dies funktionierte für mich, ich musste nur @TargetApi (Build.VERSION_CODES.HONEYCOMB) hinzufügen
Sheepdogsheep
11

Zusätzlich zu setCustomSelectionActionModeCallback und deaktivierten Long-Click- Lösungen muss verhindert werden , dass die PASTE / REPLACE-Menüs angezeigt werden , wenn auf das Textauswahl-Handle geklickt wird ( siehe Abbildung unten):

Textauswahlgriff mit Einfügemenü

Die Lösung besteht darin, zu verhindern, dass das Menü PASTE / REPLACE in der show()Methode der (nicht dokumentierten) android.widget.EditorKlasse angezeigt wird . Bevor das Menü angezeigt wird, wird eine Überprüfung durchgeführt if (!canPaste && !canSuggest) return;. Die beiden Methoden, die als Grundlage für die Festlegung dieser Variablen verwendet werden, befinden sich beide in der EditTextKlasse:

Eine vollständigere Antwort finden Sie hier .

CJBS
quelle
Dies ist die richtige und vollständige Lösung
FireZenk
Bei einigen Geräten ist anstelle der Option "Zwischenablage einfügen" die Option "Nur Einfügen" sichtbar. Ich habe Links überprüft, aber ich kann das Einfügen verhindern, aber nicht die Zwischenablage. irgendeine Idee ?
Richa
10

Kotlin-Lösung:

fun TextView.disableCopyPaste() {
    isLongClickable = false
    setTextIsSelectable(false)
    customSelectionActionModeCallback = object : ActionMode.Callback {
        override fun onCreateActionMode(mode: ActionMode?, menu: Menu): Boolean {
            return false
        }

        override fun onPrepareActionMode(mode: ActionMode?, menu: Menu): Boolean {
            return false
        }

        override fun onActionItemClicked(mode: ActionMode?, item: MenuItem): Boolean {
            return false
        }

        override fun onDestroyActionMode(mode: ActionMode?) {}
    }
}

Dann können Sie diese Methode einfach auf Ihrem TextView:

override fun onCreate() {
    priceEditText.disableCopyPaste()
}
Alexandr
quelle
1
Hallo, ich verwende diesen Ansatz, erhalte jedoch eine Type mismatchFehlermeldung mit dieser Beschreibung Required:ActionMode.Callback! Found: in diesem Teil object: ActionMode.Callback. Irgendeine Idee, warum es möglicherweise nicht funktioniert?
Abdul Mateen
8

Bei Verwendung anderer Lösungen zeigte API 26 (Oreo) immer noch den Cursorgriff durch einmaliges Tippen auf eingegebenen Text an, und dann kann das Menü angezeigt werden. Nur eine Kombination von Lösungen kann mein Problem lösen.

public class CustomEditText extends EditText {

    public CustomEditText(Context context) {
        super(context);
        init();
    }

    public CustomEditText(Context context, AttributeSet attrs) {
        super(context, attrs);
        init();
    }

    public CustomEditText(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        init();
    }

    private void init() {
        this.setCustomSelectionActionModeCallback(new BlockedActionModeCallback());
        this.setLongClickable(false);
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        if (event.getAction() == MotionEvent.ACTION_DOWN) {
            this.setInsertionDisabled();
        }
        return super.onTouchEvent(event);
    }

    /**
    * This method sets TextView#Editor#mInsertionControllerEnabled field to false
    * to return false from the Editor#hasInsertionController() method to PREVENT showing
    * of the insertionController from EditText
    * The Editor#hasInsertionController() method is called in  Editor#onTouchUpEvent(MotionEvent event) method.
    */
    private void setInsertionDisabled() {
        try {
            Field editorField = TextView.class.getDeclaredField("mEditor");
            editorField.setAccessible(true);
            Object editorObject = editorField.get(this);

            Class editorClass = Class.forName("android.widget.Editor");
            Field mInsertionControllerEnabledField = editorClass.getDeclaredField("mInsertionControllerEnabled");
            mInsertionControllerEnabledField.setAccessible(true);
            mInsertionControllerEnabledField.set(editorObject, false);
        }
        catch (Exception ignored) {
            // ignore exception here
        }
    }

    @Override
    public boolean isSuggestionsEnabled() {
        return false;
    }

    private class BlockedActionModeCallback implements ActionMode.Callback {
        public boolean onCreateActionMode(ActionMode mode, Menu menu) {
            return false;
        }

        public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
            return false;
        }

        public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
            return false;
        }

        public void onDestroyActionMode(ActionMode mode) {
        }
    }
}
Wasser
quelle
5

Wenn Sie Long Click nicht deaktivieren möchten, weil Sie beim Long Click einige Funktionen ausführen müssen, ist die Rückgabe von true eine bessere Option.

Ihr edittext langer Klick wird so sein.

edittext.setOnLongClickListener(new View.OnLongClickListener() {
      @Override
      public boolean onLongClick(View v) {
            //  Do Something or Don't
            return true;
      }
});

Gemäß Dokumentation Rückgabe von "True" an, dass lange Klicks verarbeitet wurden, sodass keine Standardoperationen ausgeführt werden müssen.

Ich habe dies auf API-Level 16, 22 und 25 getestet. Es funktioniert gut für mich. Hoffe das wird helfen.

Muak
quelle
1
Gut. Alternativ einfach android:longClickable="false"in XML einstellen
Alex Semeniuk
3

https://github.com/neopixl/PixlUI bietet EditTexteine Methode

myEditText.disableCopyAndPaste().

Und es funktioniert mit der alten API

odemolliens
quelle
1
Dies entspricht genau der von stackoverflow.com/a/22756538/3063884 bereitgestellten Halblösung . Siehe den Code: github.com/neopixl/PixlUI/blob/master/Library/src/com/neopixl/… ... Dieser Ansatz verhindert immer noch nicht, dass der Textauswahl-Handler "PASTE" anzeigt, wenn sich Text in der Zwischenablage befindet .
CJBS
3

Hier ist ein Hack zum Deaktivieren des Popups "Einfügen". Sie müssen die EditTextMethode überschreiben :

@Override
public int getSelectionStart() {
    for (StackTraceElement element : Thread.currentThread().getStackTrace()) {
        if (element.getMethodName().equals("canPaste")) {
            return -1;
        }
    }
    return super.getSelectionStart();
}

Ähnliches kann für die anderen Aktionen durchgeführt werden.

Anton Tananaev
quelle
können Sie für die Deaktivierung der Zwischenablage sagen
Richa
3

Ich habe diese Lösung getestet und das funktioniert

    mSubdomainEditText.setLongClickable(false);
    mSubdomainEditText.setCustomSelectionActionModeCallback(new ActionMode.Callback() {

      public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
        return false;
      }

      public void onDestroyActionMode(ActionMode mode) {
      }

      public boolean onCreateActionMode(ActionMode mode, Menu menu) {
        return false;
      }

      public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
        return false;
      }
    });
Aakash Anuj
quelle
1

Lesen Sie die Zwischenablage, vergleichen Sie sie mit der Eingabe und der Zeit, zu der die Eingabe "eingegeben" wurde. Wenn die Zwischenablage denselben Text enthält und zu schnell ist, löschen Sie die eingefügte Eingabe.

Kadir
quelle
1

@Zain Ali, Ihre Antwort funktioniert mit API 11. Ich wollte nur einen Weg vorschlagen, wie Sie auch mit API 10 arbeiten können. Da ich meine Projekt-API auf dieser Version pflegen musste, spielte ich ständig mit den in 2.3.3 verfügbaren Funktionen und bekam die Möglichkeit, dies zu tun. Ich habe das Snippet unten geteilt. Ich habe den Code getestet und er hat bei mir funktioniert. Ich habe diesen Ausschnitt dringend gemacht. Fühlen Sie sich frei, den Code zu verbessern, wenn Änderungen vorgenommen werden können.

// A custom TouchListener is being implemented which will clear out the focus 
// and gain the focus for the EditText, in few milliseconds so the selection 
// will be cleared and hence the copy paste option wil not pop up.
// the respective EditText should be set with this listener 
// tmpEditText.setOnTouchListener(new MyTouchListener(tmpEditText, tmpImm));

public class MyTouchListener implements View.OnTouchListener {

    long click = 0;
    EditText mEtView;
    InputMethodManager imm;

    public MyTouchListener(EditText etView, InputMethodManager im) {
        mEtView = etView;
        imm = im;
    }

    @Override
    public boolean onTouch(View v, MotionEvent event) {

        if (event.getAction() == MotionEvent.ACTION_DOWN) {
            long curr = System.currentTimeMillis();
            if (click !=0 && ( curr - click) < 30) {

                mEtView.setSelected(false);
                new Handler().postDelayed(new Runnable() {
                    @Override
                    public void run() {
                        mEtView.setSelected(true);
                        mEtView.requestFocusFromTouch();
                        imm.showSoftInput(mEtView, InputMethodManager.RESULT_SHOWN);
                    }
                },25);

            return true;
            }
            else {
                if (click == 0)
                    click = curr;
                else
                    click = 0;
                new Handler().postDelayed(new Runnable() {
                    @Override
                    public void run() {
                        mEtView.requestFocusFromTouch();
                        mEtView.requestFocusFromTouch();
                        imm.showSoftInput(mEtView, InputMethodManager.RESULT_SHOWN);
                    }
                },25);
            return true;
            }

        } else if (event.getAction() == MotionEvent.ACTION_MOVE) {
            mEtView.setSelected(false);
            new Handler().postDelayed(new Runnable() {
                @Override
                public void run() {
                    mEtView.setSelected(true);
                    mEtView.requestFocusFromTouch();
                    mEtView.requestFocusFromTouch();
                    imm.showSoftInput(mEtView, InputMethodManager.RESULT_SHOWN);
                }
            },25);
            return true;
        }
        return false;
    }
Aravind
quelle
1

Die Lösung ist sehr einfach

public class MainActivity extends AppCompatActivity {

EditText et_0;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    et_0 = findViewById(R.id.et_0);

    et_0.setCustomSelectionActionModeCallback(new ActionMode.Callback() {
        @Override
        public boolean onCreateActionMode(ActionMode mode, Menu menu) {
            //to keep the text selection capability available ( selection cursor)
            return true;
        }

        @Override
        public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
            //to prevent the menu from appearing
            menu.clear();
            return false;
        }

        @Override
        public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
            return false;
        }

        @Override
        public void onDestroyActionMode(ActionMode mode) {

        }
    });
   }
}

--------> Vorschau <---------

Muhammad Ali
quelle
1

Versuchen Sie, der vorherigen Klasse für das vorherige Kopieren und Einfügen zu folgen Edittext

public class SegoeUiEditText extends AppCompatEditText {
private final Context context;


@Override
public boolean isSuggestionsEnabled() {
    return false;
}
public SegoeUiEditText(Context context) {
    super(context);
    this.context = context;
    init();
}

public SegoeUiEditText(Context context, AttributeSet attrs) {
    super(context, attrs);
    this.context = context;
    init();
}

public SegoeUiEditText(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);
    this.context = context;
    init();
}


private void setFonts(Context context) {
    this.setTypeface(Typeface.createFromAsset(context.getAssets(), "Fonts/Helvetica-Normal.ttf"));
}

private void init() {

        setTextIsSelectable(false);
        this.setCustomSelectionActionModeCallback(new ActionModeCallbackInterceptor());
        this.setLongClickable(false);

}
@Override
public int getSelectionStart() {

    for (StackTraceElement element : Thread.currentThread().getStackTrace()) {
        if (element.getMethodName().equals("canPaste")) {
            return -1;
        }
    }
    return super.getSelectionStart();
}
/**
 * Prevents the action bar (top horizontal bar with cut, copy, paste, etc.) from appearing
 * by intercepting the callback that would cause it to be created, and returning false.
 */
private class ActionModeCallbackInterceptor implements ActionMode.Callback, android.view.ActionMode.Callback {
    private final String TAG = SegoeUiEditText.class.getSimpleName();

    public boolean onCreateActionMode(ActionMode mode, Menu menu) { return false; }
    public boolean onPrepareActionMode(ActionMode mode, Menu menu) { return false; }
    public boolean onActionItemClicked(ActionMode mode, MenuItem item) { return false; }
    public void onDestroyActionMode(ActionMode mode) {}

    @Override
    public boolean onCreateActionMode(android.view.ActionMode mode, Menu menu) {
        return false;
    }

    @Override
    public boolean onPrepareActionMode(android.view.ActionMode mode, Menu menu) {
        menu.clear();
        return false;
    }

    @Override
    public boolean onActionItemClicked(android.view.ActionMode mode, MenuItem item) {
        return false;
    }

    @Override
    public void onDestroyActionMode(android.view.ActionMode mode) {

    }
}

}}

Sagar Jethva
quelle
1

Für Smartphones mit Zwischenablage ist dies möglich.

editText.setFilters(new InputFilter[]{new InputFilter() {
        @Override
        public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {
            if (source.length() > 1) {
                return "";
            }  return null;
        }
    }});
José Torres
quelle
0

Ich habe festgestellt, dass das Einfügen solcher Zeichen in den Bearbeitungstext keine Auswirkungen hat, wenn Sie einen Eingabefilter erstellen, um die Eingabe unerwünschter Zeichen zu vermeiden. Diese Art löst also auch mein Problem.

rDroid
quelle
0

Sie können android versuchen: focusableInTouchMode = "false".

stdout
quelle
Es wird nie
funktionieren
0

Die Lösung, die für mich funktioniert hat, bestand darin, einen benutzerdefinierten Edittext zu erstellen und die folgende Methode zu überschreiben:

public class MyEditText extends EditText {

private int mPreviousCursorPosition;

@Override
protected void onSelectionChanged(int selStart, int selEnd) {
    CharSequence text = getText();
    if (text != null) {
        if (selStart != selEnd) {
            setSelection(mPreviousCursorPosition, mPreviousCursorPosition);
            return;
        }
    }
    mPreviousCursorPosition = selStart;
    super.onSelectionChanged(selStart, selEnd);
}

}}

Palejandro
quelle
0

Versuchen zu benutzen.

myEditext.setCursorVisible(false);

       myEditext.setCustomSelectionActionModeCallback(new ActionMode.Callback() {

        public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
            // TODO Auto-generated method stub
            return false;
        }

        public void onDestroyActionMode(ActionMode mode) {
            // TODO Auto-generated method stub

        }

        public boolean onCreateActionMode(ActionMode mode, Menu menu) {
            // TODO Auto-generated method stub
            return false;
        }

        public boolean onActionItemClicked(ActionMode mode,
                MenuItem item) {
            // TODO Auto-generated method stub
            return false;
        }
    });
Thambidurai
quelle
0

Wer in Kotlin nach einer Lösung sucht, verwendet die folgende Klasse als benutzerdefiniertes Widget und verwendet sie in der XML.

Klasse SecureEditText: TextInputEditText {

/** This is a replacement method for the base TextView class' method of the same name. This method
 * is used in hidden class android.widget.Editor to determine whether the PASTE/REPLACE popup
 * appears when triggered from the text insertion handle. Returning false forces this window
 * to never appear.
 * @return false
 */
override fun isSuggestionsEnabled(): Boolean {
    return false
}

override fun getSelectionStart(): Int {
    for (element in Thread.currentThread().stackTrace) {
        if (element.methodName == "canPaste") {
            return -1
        }
    }
    return super.getSelectionStart()
}

public override fun onSelectionChanged(start: Int, end: Int) {

    val text = text
    if (text != null) {
        if (start != text.length || end != text.length) {
            setSelection(text.length, text.length)
            return
        }
    }

    super.onSelectionChanged(start, end)
}

companion object {
    private val EDITTEXT_ATTRIBUTE_COPY_AND_PASTE = "isCopyPasteDisabled"
    private val PACKAGE_NAME = "http://schemas.android.com/apk/res-auto"
}

constructor(context: Context, attrs: AttributeSet) : super(context, attrs) {
    disableCopyAndPaste(context, attrs)
}

/**
 * Disable Copy and Paste functionality on EditText
 *
 * @param context Context object
 * @param attrs   AttributeSet Object
 */
private fun disableCopyAndPaste(context: Context, attrs: AttributeSet) {
    val isDisableCopyAndPaste = attrs.getAttributeBooleanValue(
        PACKAGE_NAME,
        EDITTEXT_ATTRIBUTE_COPY_AND_PASTE, true
    )
    if (isDisableCopyAndPaste && !isInEditMode()) {
        val inputMethodManager =
            context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
        this.setLongClickable(false)
        this.setOnTouchListener(BlockContextMenuTouchListener(inputMethodManager))
    }
}

/**
 * Perform Focus Enabling Task to the widget with the help of handler object
 * with some delay
 * @param inputMethodManager is used to show the key board
 */
private fun performHandlerAction(inputMethodManager: InputMethodManager) {
    val postDelayedIntervalTime: Long = 25
    Handler().postDelayed(Runnable {
        this@SecureEditText.setSelected(true)
        this@SecureEditText.requestFocusFromTouch()
        inputMethodManager.showSoftInput(
            this@SecureEditText,
            InputMethodManager.RESULT_SHOWN
        )
    }, postDelayedIntervalTime)
}

/**
 * Class to Block Context Menu on double Tap
 * A custom TouchListener is being implemented which will clear out the focus
 * and gain the focus for the EditText, in few milliseconds so the selection
 * will be cleared and hence the copy paste option wil not pop up.
 * the respective EditText should be set with this listener
 *
 * @param inputMethodManager is used to show the key board
 */
private inner class BlockContextMenuTouchListener internal constructor(private val inputMethodManager: InputMethodManager) :
    View.OnTouchListener {
    private var lastTapTime: Long = 0
    val TIME_INTERVAL_BETWEEN_DOUBLE_TAP = 30
    override fun onTouch(v: View, event: MotionEvent): Boolean {
        if (event.getAction() === MotionEvent.ACTION_DOWN) {
            val currentTapTime = System.currentTimeMillis()
            if (lastTapTime != 0L && currentTapTime - lastTapTime < TIME_INTERVAL_BETWEEN_DOUBLE_TAP) {
                this@SecureEditText.setSelected(false)
                performHandlerAction(inputMethodManager)
                return true
            } else {
                if (lastTapTime == 0L) {
                    lastTapTime = currentTapTime
                } else {
                    lastTapTime = 0
                }
                performHandlerAction(inputMethodManager)
                return true
            }
        } else if (event.getAction() === MotionEvent.ACTION_MOVE) {
            this@SecureEditText.setSelected(false)
            performHandlerAction(inputMethodManager)
        }
        return false
    }
}

}}

Dev
quelle
0

Ich habe die Erweiterungsfunktion in Kotlin- Sprache hinzugefügt :

fun EditText.disableTextSelection() {
    this.setCustomSelectionActionModeCallback(object : android.view.ActionMode.Callback {
        override fun onActionItemClicked(mode: android.view.ActionMode?, item: MenuItem?): Boolean {
            return false
        }
        override fun onCreateActionMode(mode: android.view.ActionMode?, menu: Menu?): Boolean {
            return false
        }
        override fun onPrepareActionMode(mode: android.view.ActionMode?, menu: Menu?): Boolean {
            return false
        }
        override fun onDestroyActionMode(mode: android.view.ActionMode?) {
        }
    })
}

Sie können es so verwenden:

edit_text.disableTextSelection()

auch unter Zeile in Ihrer XML hinzugefügt:

                android:longClickable="false"
                android:textIsSelectable="false"
Adnan Abdollah Zaki
quelle