Android: How to TOTALLY disable copy and paste function in Edittext

后端 未结 4 1133
爱一瞬间的悲伤
爱一瞬间的悲伤 2020-12-11 19:38

I am quite new to Android developing area and recently I hv encountered a tough problem.

I was trying to make a Edittext which should NOT ALLOW user to copy content

相关标签:
4条回答
  • 2020-12-11 20:01

    There is one possibility, by disabling the cursor handler. You won't get the paste button, but you will also not be able to move the cursor with touch.

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        if (event.getActionMasked() == MotionEvent.ACTION_UP && mDisableCursorHandle) {
            // Hack to prevent keyboard and insertion handle from showing.
            cancelLongPress();
        }
        return super.onTouchEvent(event);
    }
    
    0 讨论(0)
  • 2020-12-11 20:03

    best programmatically way is:

    myEdittext.setLongClickable(false);
    

    Or, just in xml

    android:longClickable="false"
    
    0 讨论(0)
  • 2020-12-11 20:04

    You can totally hide "select all, copy and paste" menu and also "paste" function which pop up when simple tap on the cursor.

    For that you have to create a custom EditText class. Here is an example...

    // Custom EditText class
    public class NoMenuEditText extends EditText
    {
        private final Context context;
    
        /** 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
        */
        boolean canPaste()
        {
            return false;
        }
    
        /** 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
        public boolean isSuggestionsEnabled()
        {
            return false;
        }
    
        public NoMenuEditText(Context context)
        {
            super(context);
            this.context = context;
            init();
        }
    
        public NoMenuEditText(Context context, AttributeSet attrs)
        {
            super(context, attrs);
            this.context = context;
            init();
        }
    
        public NoMenuEditText(Context context, AttributeSet attrs, int defStyle)
        {
            super(context, attrs, defStyle);
            this.context = context;
            init();
        }
    
        private void init()
        {
            this.setCustomSelectionActionModeCallback(new ActionModeCallbackInterceptor());
            this.setLongClickable(false);
        }
    
    
        /**
        * 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
        {
            private final String TAG = NoMenuEditText.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) {}
        }
    } 
    

    Use this EditText in your layout. Now, it will not show any copy/paste menu. It will show only blue handle but when you click on that you will not get any pop up of paste option.

    Hope this helps...

    0 讨论(0)
  • 2020-12-11 20:04

    the solution is very simple

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

    sample preview

    0 讨论(0)
提交回复
热议问题