How to disable copy/paste from/to EditText

后端 未结 24 1702
情歌与酒
情歌与酒 2020-11-22 12:18

In my application, there is a registration screen, where i do not want the user to be able to copy/paste text into the EditText field. I have set an onLon

24条回答
  •  执笔经年
    2020-11-22 12:43

    Who is looking for a solution in Kotlin use the below class as a custom widget and use it in the xml.

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

    }

提交回复
热议问题