Android:如何在 Edittext 中完全禁用复制和粘贴功能

Posted

技术标签:

【中文标题】Android:如何在 Edittext 中完全禁用复制和粘贴功能【英文标题】:Android: How to TOTALLY disable copy and paste function in Edittext 【发布时间】:2014-11-28 06:45:17 【问题描述】:

我对 android 开发领域还很陌生,最近遇到了一个棘手的问题。

我正在尝试制作一个不应允许用户从中复制内容或将内容粘贴到其中的 Edittext。我用谷歌搜索了很多,发现似乎有两种流行的方法:

第一种方式,在布局文件中设置:

android:longClickable="false"

第二种方式,以编程方式设置它:

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

但我发现无论我选择哪种方式,edittext 区域都只能禁用长按,这会阻止用户通过长按访问“全选,复制和粘贴”菜单。但是这两种解决方案都没有阻止用户通过简单地点击光标来访问“粘贴”功能。

所以我的问题是:我怎么能完全阻止用户在某个 Edittext 中进行复制和粘贴功能。有人帮忙吗?非常感谢

【问题讨论】:

可能重复。 ***.com/questions/6275299/… @Dhina OP 已经提到了重复链接中使用的代码。他/她仍然有问题。 嗨@Dhina。我已经尝试了您给我的链接中的所有答案,但正如我上面提到的,所有方法都无法阻止用户通过点击光标进入“粘贴”功能。所以我需要更好的解决方案 Hi@jinnancun 你找到解决办法了吗 【参考方案1】:

您可以完全隐藏“全选,复制和粘贴”菜单,以及只需点击光标即可弹出的“粘贴”功能。

为此,您必须创建一个自定义 EditText 类。这是一个例子......

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

在您的布局中使用此 EditText。现在,它不会显示任何复制/粘贴菜单。它只会显示蓝色手柄,但是当您单击它时,您不会弹出任何粘贴选项。

希望这会有所帮助...

【讨论】:

【参考方案2】:

最好的编程方式是:

myEdittext.setLongClickable(false);

或者,只是在 xml 中

android:longClickable="false"

【讨论】:

考虑用最少的解释改进你的答案。这是一个低质量的答案,即使它可能正在回答问题。 OP 已经尝试过了,它在问题中 - 只是从那里复制并列为答案?仅此一项并不能满足用户遇到的问题。【参考方案3】:

解决方法很简单

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

【讨论】:

【参考方案4】:

有一种可能,就是禁用游标处理程序。您将无法获得粘贴按钮,但您也无法通过触摸移动光标。

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

【讨论】:

嗨,Ricardo,感谢您提供的巧妙解决方案。但我确实需要显示光标。所以可能我仍然需要找到其他一些解决方案。无论如何谢谢。 Ricardo,你从哪里得到mDisableCursorHandle

以上是关于Android:如何在 Edittext 中完全禁用复制和粘贴功能的主要内容,如果未能解决你的问题,请参考以下文章

android如何禁止edittext复制粘贴

Android中EditText无法完全显示

如何在 Android 中禁用 EditText

如何在 android 小部件 EditText 中添加水印?

如何在android中动态添加edittext?

如何在 android 中删除 EditText 材料设计底线?