2014-10-03 78 views
4

我對Android開發領域頗爲陌生,最近我遇到了一個棘手的問題。Android:如何在Edittext中完全禁用複製和粘貼功能

我試圖製作一個EditText,它不應該允許用戶從內容複製或粘貼內容。我HV GOOGLE了很多,發現那裏似乎是2種流行這樣的方式:

1方式,將其設置在佈局文件:

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的複製和粘貼功能。有人幫忙嗎? Thx很多

+1

可能重複。 http://stackoverflow.com/questions/6275299/how-to-disable-copy-paste-from-to-edit-text – Dhina 2014-10-03 07:43:05

+1

@Dhina OP已經提到代碼,無論使用重複鏈接。他/她仍然有問題。 – 2014-10-03 07:44:19

+0

Hi @Dhina。我已經嘗試了所有你給我的鏈接的答案,但正如我上面提到的,所有的方法都不能阻止用戶通過點擊光標進入「粘貼」功能。所以我需要更好的解決方案 – jinnancun 2014-10-06 23:25:03

回答

1

有一種可能性,通過禁用遊標處理程序。您將無法獲得粘貼按鈕,但您也無法通過觸摸移動光標。

@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

嗨裏卡多,謝謝你的光滑解決方案。但我確實需要顯示光標。所以我可能還需要找到其他解決方案。無論如何。 – jinnancun 2015-03-23 01:21:04

5

您完全可以隱藏「選擇所有,複製和粘貼」菜單,也可以在簡單輕擊光標時彈出「粘貼」功能。

爲此,您必須創建自定義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。現在,它不會顯示任何複製/粘貼菜單。它將只顯示藍色的句柄,但是當你點擊它時,你將不會彈出粘貼選項。

希望這有助於...

+0

此解決方案在Redmi 4設備中不起作用。 – 2017-07-24 10:47:31

3

編程最好的方法是:

myEdittext.setLongClickable(false); 

或者,只是在XML

android:longClickable="false" 
+0

考慮用最少的解釋來改進你的答案。這是一個低質量的答案,即使它可能回答這個問題。 – HDJEMAI 2016-07-16 17:56:43

相關問題