Cara menonaktifkan copy / paste dari / ke EditText

131

Dalam aplikasi saya, ada layar pendaftaran, di mana saya tidak ingin pengguna dapat menyalin / menempelkan teks ke dalam EditTextbidang. Saya telah menetapkan onLongClickListenermasing-masing EditTextsehingga menu konteks menampilkan copy / paste / inputmethod dan opsi lainnya tidak muncul. Jadi pengguna tidak akan dapat menyalin / menempel ke bidang Edit.

 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;
        }
    };

Tetapi masalah muncul jika pengguna telah mengaktifkan keyboard pihak ketiga selain dari standar Android, yang mungkin memiliki tombol untuk menyalin / menempel atau yang mungkin menampilkan menu konteks yang sama. Jadi bagaimana cara menonaktifkan copy / paste dalam skenario itu?

Tolong beri tahu saya jika ada cara lain untuk menyalin / menempel juga. (dan mungkin cara menonaktifkannya)

Bantuan apa pun akan dihargai.

rDroid
sumber
Jika operasi "tempel" berasal dari IME, maka Anda tidak memiliki cara standar untuk membedakannya dari penekanan tombol normal. Satu ide untuk dicoba adalah mengukur waktu antara kedatangan masing-masing karakter dan jika waktunya terlalu singkat, maka karakter tersebut berasal dari operasi "tempel".
BitBank
tampaknya soloution kotor! Menarik untuk dilihat.
rDroid
1
gunakan android: longClickable = "false"
Azay Gupta

Jawaban:

112

Jika Anda menggunakan API level 11 atau lebih tinggi maka Anda dapat menghentikan penyalinan, tempel, potong dan menu konteks kustom agar tidak muncul.

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;
            }
        });

Mengembalikan false dari onCreateActionMode (ActionMode, Menu) akan mencegah dimulainya mode aksi (Pilih Semua, Potong, Salin, dan tempel tindakan).

Zain Ali
sumber
1
bagaimana dengan level api di bawah 13?
Jonathan
1
Tidak mengerti kedua komentar, contoh ini berfungsi api11 +, pra-api11 tidak ada salin dan tempel IIRC
scottyab
28
Tidak berfungsi untuk saya. Tombol pasta akan muncul jika mengetuk indikator kursor biru.
batal
8
Juga tidak bekerja untuk saya. On Double mengetuk menu copy-paste ditampilkan.
Android Killer
ini tidak berfungsi lagi di android 6.0, periksa jawaban ini stackoverflow.com/questions/27869983/…
has19
132

Metode terbaik adalah menggunakan:

etUsername.setLongClickable(false);
Vicky Kapadia
sumber
58
Atau, hanya dalam xml android:longClickable="false":)
lomza
19
Tombol tempel akan muncul jika mengetuk indikator kursor biru.
void
16
Ini tentu saja akan mencegah tampilan menjadi diklik panjang, tetapi kontrol pengeditan juga dapat diminta dengan mengetuk dua kali pada teks, yang berarti bahwa solusi ini tidak lengkap. Ingatlah ini untuk tujuan Anda.
Kevin Grant
1
Juga, pintasan keyboard masih bisa berfungsi (Ctrl + C) dengan keyboard eksternal.
Oleg Vaskevich
Ini tidak berfungsi pada Ice Cream Sandwich karena opsi clipboard dapat dibuka dengan mengetuk teks ganda, serta mengetuk panjang.
Paul Wintz
44

Anda dapat melakukan ini dengan menonaktifkan pers panjang EditText

Untuk mengimplementasikannya, cukup tambahkan baris berikut di xml -

android:longClickable="false"
Ameya Pandilwar
sumber
6
Masalahnya adalah pengguna aplikasi saya memiliki keyboard pihak ketiga yang memiliki tombol salin dan tempel.
rDroid
3
masalah lain adalah Anda dapat memilih teks dengan ketuk dua kali dan itu menunjukkan salin / tempel lagi
Nikola
37

Saya dapat menonaktifkan fungsionalitas salin dan tempel dengan yang berikut:

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);

Semoga berhasil untuk Anda ;-)

Joseph Johnson
sumber
Ini adalah solusi yang sama persis saya akhirnya berdasarkan pada jawaban lain di atas. Ini harus ditandai sebagai solusi yang tepat karena menangani kasus tepi yang lain tidak
Andrew Hoefling
2
Opsi ini memblokir salinan tetapi Anda masih bisa menempel dengan mengklik kursor.
Mehul Kanzariya
12

di sini adalah cara terbaik untuk menonaktifkan cut copy paste karya editText di semua versi

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
sumber
Ini bekerja untuk saya, saya baru saja menambahkan @TargetApi (Build.VERSION_CODES.HONEYCOMB)
Sheepdogsheep
11

Selain setCustomSelectionActionModeCallback , dan solusi klik lama yang dinonaktifkan , perlu untuk mencegah menu PASTE / REPLACE muncul ketika pegangan pemilihan teks diklik, seperti gambar di bawah ini:

Pegangan pemilihan teks dengan menu tempel

Solusinya terletak pada mencegah menu PASTE / REPLACE dari muncul dalam show()metode kelas (non-didokumentasikan) android.widget.Editor. Sebelum menu muncul, pemeriksaan dilakukan untuk if (!canPaste && !canSuggest) return;. Dua metode yang digunakan sebagai dasar untuk mengatur variabel-variabel ini sama-sama ada di EditTextkelas:

Jawaban yang lebih lengkap tersedia di sini .

CJBS
sumber
Ini adalah solusi yang BENAR dan LENGKAP
FireZenk
Di beberapa perangkat, bukannya opsi Tempel Papan Klip terlihat, hanya bertindak sebagai tempel. saya memeriksa tautan tetapi saya dapat mencegah tempel tetapi bukan papan klip. ada ide ?
Richa
10

Solusi Kotlin:

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?) {}
    }
}

Maka Anda bisa memanggil metode ini di TextView:

override fun onCreate() {
    priceEditText.disableCopyPaste()
}
Alexandr
sumber
1
Hai, saya menggunakan pendekatan ini, tetapi saya mendapatkan Type mismatchkesalahan dengan uraian Required:ActionMode.Callback! Found: ini pada bagian ini object: ActionMode.Callback. Adakah yang tahu mengapa itu tidak berhasil?
Abdul Mateen
8

Menggunakan solusi lain, API 26 (Oreo) masih menunjukkan pegangan kursor dengan satu ketukan pada teks yang dimasukkan, dan kemudian menu dapat ditampilkan. Hanya kombinasi solusi yang dapat menyelesaikan masalah saya.

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) {
        }
    }
}
air
sumber
5

Jika Anda tidak ingin menonaktifkan klik panjang karena Anda perlu melakukan beberapa fungsionalitas pada klik panjang daripada mengembalikan true adalah pilihan yang lebih baik untuk melakukannya.

Klik panjang edittext Anda akan seperti ini.

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

Sesuai dokumentasi Mengembalikan "True" akan menunjukkan bahwa klik panjang telah ditangani sehingga tidak perlu melakukan operasi standar.

Saya menguji ini pada API level 16, 22 dan 25. Ini berfungsi dengan baik untuk saya. Semoga ini bisa membantu.

muak
sumber
1
Bagus Atau, cukup atur android:longClickable="false"dalam XML
Alex Semeniuk
3

https://github.com/neopixl/PixlUI menyediakan EditTextmetode

myEditText.disableCopyAndPaste().

Dan itu berfungsi pada API lama

Odemolliens
sumber
1
Ini tidak persis sama dengan setengah-solusi yang disediakan oleh stackoverflow.com/a/22756538/3063884 . Lihat kode: github.com/neopixl/PixlUI/blob/master/Library/src/com/neopixl/… ... Pendekatan ini masih tidak mencegah penangan pemilihan teks menampilkan "PASTE" jika ada teks di clipboard .
CJBS
3

Ini adalah hack untuk menonaktifkan popup "paste". Anda harus mengganti EditTextmetode:

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

Serupa dapat dilakukan untuk tindakan lain.

Anton Tananaev
sumber
dapatkah Anda memberi tahu untuk menonaktifkan Clipboard
Richa
3

Saya sudah menguji solusi ini dan ini berhasil

    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
sumber
1

Baca Clipboard, periksa input dan waktu input "diketik". Jika Clipboard memiliki teks yang sama dan terlalu cepat, hapus input yang ditempel.

kadir
sumber
1

@ Zain Ali, jawaban Anda berfungsi di API 11. Saya hanya ingin menyarankan cara untuk melakukannya di API 10 juga. Karena saya harus mempertahankan API proyek saya pada versi itu, saya terus-menerus bermain dengan fungsi yang tersedia di 2.3.3 dan mendapat kemungkinan untuk melakukannya. Saya telah membagikan cuplikan di bawah ini. Saya menguji kode dan ternyata berhasil untuk saya. Saya membuat potongan ini atas urgensi. Jangan ragu untuk memperbaiki kode jika ada perubahan yang dapat dilakukan ..

// 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
sumber
1

solusinya sangat sederhana

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) {

        }
    });
   }
}

--------> pratinjau <---------

Muhammad Ali
sumber
1

Coba ikuti kelas custome untuk mendapatkan copy dan paste 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
sumber
1

Untuk smartphone dengan clipboard, dimungkinkan cegah seperti ini.

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
sumber
0

Saya menemukan bahwa ketika Anda membuat filter input untuk menghindari masuknya karakter yang tidak diinginkan, menempelkan karakter tersebut ke dalam teks edit tidak berpengaruh. Jadi ini semacam memecahkan masalah saya juga.

rDroid
sumber
0

Anda dapat mencoba android: focusableInTouchMode = "false".

stdout
sumber
Ini tidak akan pernah berhasil
Ragavendra M
0

Solusi yang berhasil bagi saya adalah membuat Edittext khusus dan mengganti metode berikut:

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
sumber
0

Coba gunakan.

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
sumber
0

Siapa yang mencari solusi di Kotlin menggunakan kelas di bawah ini sebagai widget khusus dan menggunakannya dalam xml.

kelas 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
sumber
0

saya menambahkan Fungsi Ekstensi dalam bahasa Kotlin :

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?) {
        }
    })
}

Anda dapat menggunakannya seperti ini:

edit_text.disableTextSelection()

juga menambahkan baris di bawah ini di xml Anda:

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