Cách tắt sao chép / dán từ / đến EditText


131

Trong ứng dụng của tôi, có một màn hình đăng ký, nơi tôi không muốn người dùng có thể sao chép / dán văn bản vào EditTexttrường. Tôi đã đặt onLongClickListenertừng EditTextcái để menu ngữ cảnh hiển thị sao chép / dán / inputmethod và các tùy chọn khác không hiển thị. Vì vậy, người dùng sẽ không thể sao chép / dán vào các trường Chỉnh sửa.

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

Nhưng vấn đề phát sinh nếu người dùng đã kích hoạt bàn phím của bên thứ ba không phải là mặc định của Android, có thể có nút để sao chép / dán hoặc có thể hiển thị cùng một menu ngữ cảnh. Vậy làm thế nào để tôi vô hiệu hóa sao chép / dán trong kịch bản đó?

Xin vui lòng cho tôi biết nếu có những cách khác để sao chép / dán là tốt. (và có thể làm thế nào để vô hiệu hóa chúng)

Bất kỳ trợ giúp sẽ được đánh giá cao.


Nếu thao tác "dán" xuất phát từ IME, thì bạn không có cách phân biệt tiêu chuẩn nào với tổ hợp phím thông thường. Một ý tưởng nên thử là đo thời gian giữa mỗi lần xuất hiện của nhân vật và nếu thời gian quá ngắn, thì các nhân vật sẽ đến từ một hoạt động "dán".
BitBank

dường như là bẩn đáng xem mặc dù.
rDroid

1
sử dụng android: longClickable = "false"
Azay Gupta

Câu trả lời:


112

Nếu bạn đang sử dụng API cấp 11 trở lên thì bạn có thể dừng sao chép, dán, cắt và tùy chỉnh các menu ngữ cảnh xuất hiện theo.

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

Trả về false từ onCreateActionMode (ActionMode, Menu) sẽ ngăn chế độ hành động bắt đầu (Chọn tất cả, Cắt, Sao chép và Dán hành động).


1
cấp độ api dưới 13 thì sao?
Jonathan

1
Không hiểu ý kiến ​​nào, mẫu này hoạt động api11 +, pre-api11 không sao chép và dán IIRC
scottyab

28
Không hoạt động cho tôi. Nút vị trí sẽ xuất hiện trong trường hợp nhấn vào chỉ báo con trỏ màu xanh.
khoảng trống

8
Cũng không làm việc cho tôi. Khi nhấn đúp vào menu sao chép-dán đang hiển thị.
Kẻ giết người Android

Điều này không còn hoạt động nữa trên Android 6.0, hãy kiểm tra câu trả lời này stackoverflow.com/questions/27869983/NH
has19

132

Phương pháp tốt nhất là sử dụng:

etUsername.setLongClickable(false);

58
Hoặc, chỉ trong xml android:longClickable="false":)
lomza

19
Nút dán sẽ xuất hiện trong trường hợp nhấn vào chỉ báo con trỏ màu xanh.
khoảng trống

16
Điều này chắc chắn sẽ ngăn chế độ xem có thể nhấp dài, nhưng các điều khiển chỉnh sửa cũng có thể được yêu cầu bằng cách nhấn đúp vào văn bản, điều đó có nghĩa là giải pháp này chưa hoàn tất. Hãy ghi nhớ điều này cho mục đích của bạn.
Kevin Grant

1
Ngoài ra, các phím tắt vẫn có thể hoạt động (Ctrl + C) w / bàn phím ngoài.
Oleg Vaskevich

Điều này không hoạt động trên Ice Cream Sandwich vì các tùy chọn clipboard có thể được mở bằng cách nhấn đúp vào văn bản, cũng như nhấn lâu.
Paul Wintz

44

Bạn có thể làm điều này bằng cách vô hiệu hóa nhấn lâu của EditText

Để thực hiện nó, chỉ cần thêm dòng sau vào xml -

android:longClickable="false"

6
vấn đề là người dùng ứng dụng của tôi có bàn phím bên thứ ba có nút sao chép và dán.
rDroid

3
một vấn đề khác là bạn có thể chọn văn bản bằng cách chạm hai lần và nó hiển thị sao chép / dán lại
Nikola

37

Tôi có thể tắt chức năng sao chép và dán bằng cách sau:

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

Hi vọng nó sẽ giúp ích cho bạn ;-)


Đây là cùng một giải pháp tôi đã kết thúc dựa trên các câu trả lời khác ở trên. Điều này nên được đánh dấu là giải pháp chính xác vì nó xử lý các trường hợp cạnh mà những người khác không làm
Andrew Hoefling

2
Tùy chọn này chặn bản sao nhưng bạn vẫn có thể dán bằng cách nhấp vào con trỏ.
Mehul Kanzariya

12

Đây là cách tốt nhất để vô hiệu hóa bản sao cắt của công việc chỉnh sửa trong tất cả các phiên bản

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

Điều này làm việc cho tôi, tôi chỉ cần thêm @TargetApi (Build.VERSION_CODES.HONEYCOMB)
Sheepdogsheep

11

Ngoài setCustomSelectionActionModeCallbackcác giải pháp nhấp dài bị vô hiệu hóa , cần phải ngăn các menu PASTE / REPLACE xuất hiện khi nhấp vào xử lý lựa chọn văn bản, theo hình ảnh bên dưới:

Xử lý lựa chọn văn bản với menu dán

Giải pháp nằm ở việc ngăn menu PASTE / REPLACE xuất hiện trong show()phương thức của lớp (không có tài liệu) android.widget.Editor. Trước khi menu xuất hiện, kiểm tra được thực hiện if (!canPaste && !canSuggest) return;. Hai phương thức được sử dụng làm cơ sở để đặt các biến này đều nằm trong EditTextlớp:

Một câu trả lời đầy đủ hơn có sẵn ở đây .


Đây là giải pháp ĐÚNG và HOÀN THÀNH
FireZenk

Trong một số thiết bị thay vì tùy chọn Dán Clipboard hiển thị, chỉ hoạt động như dán. tôi đã kiểm tra các liên kết nhưng tôi có thể ngăn chặn dán nhưng không phải clipboard. bất kỳ ý tưởng ?
Richa

10

Giải pháp của 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?) {}
    }
}

Sau đó, bạn có thể chỉ cần gọi phương thức này trên TextView:

override fun onCreate() {
    priceEditText.disableCopyPaste()
}

1
Xin chào, tôi đang sử dụng phương pháp này, nhưng tôi gặp Type mismatchlỗi với mô tả Required:ActionMode.Callback! Found: này về phần này object: ActionMode.Callback. Bất cứ ý tưởng tại sao nó có thể không hoạt động?
Abdul Mateen

8

Sử dụng các giải pháp khác, API 26 (Oreo) vẫn hiển thị xử lý con trỏ bằng cách nhấn một lần vào văn bản đã nhập và sau đó menu có thể được hiển thị. Chỉ có sự kết hợp của các giải pháp có thể giải quyết vấn đề của tôi.

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

5

Nếu bạn không vô hiệu hóa nhấp chuột dài vì bạn cần thực hiện một số chức năng khi nhấp dài hơn trả về true là một lựa chọn tốt hơn để làm như vậy.

Edittext nhấp chuột dài của bạn sẽ như thế này.

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

Theo tài liệu Trả về "Đúng" sẽ chỉ ra rằng nhấp chuột dài đã được xử lý nên không cần thực hiện các thao tác mặc định.

Tôi đã thử nghiệm điều này trên API cấp 16, 22 và 25. Nó hoạt động tốt với tôi. Hy vọng điều này sẽ giúp.


1
Tốt một. Ngoài ra, chỉ cần đặt android:longClickable="false"trong XML
Alex Semeniuk

3

https://github.com/neopixl/PixlUI cung cấp EditTextmột phương thức

myEditText.disableCopyAndPaste().

Và nó hoạt động trên API cũ


1
Điều này thực hiện chính xác giống như một nửa giải pháp được cung cấp bởi stackoverflow.com/a/22756538/3063884 . Xem mã: github.com/neopixl/PixlUI/blob/master/L Library / src / com / neopixl / trộm ... Cách tiếp cận này vẫn không ngăn trình xử lý chọn văn bản hiển thị "PASTE" nếu có văn bản trong bảng tạm .
CJBS

3

Đây là một hack để vô hiệu hóa "dán" cửa sổ bật lên. Bạn phải ghi đè EditTextphương thức:

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

Tương tự có thể được thực hiện cho các hành động khác.


bạn có thể nói về việc vô hiệu hóa Clipboard không
Richa

3

Tôi đã thử nghiệm giải pháp này và nó hoạt động

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

1

Đọc Clipboard, kiểm tra lại đầu vào và thời gian đầu vào được "gõ". Nếu Clipboard có cùng văn bản và quá nhanh, hãy xóa đầu vào đã dán.


1

@Zain Ali, câu trả lời của bạn hoạt động trên API 11. Tôi chỉ muốn đề xuất một cách thực hiện trên API 10. Vì tôi phải duy trì API dự án của mình trên phiên bản đó, tôi đã liên tục chơi với các chức năng có sẵn trong phiên bản 2.3.3 và có khả năng thực hiện nó. Tôi đã chia sẻ đoạn trích dưới đây. Tôi đã kiểm tra mã và nó đã làm việc cho tôi. Tôi đã làm đoạn trích này một cách khẩn cấp. Vui lòng cải thiện mã nếu có bất kỳ thay đổi nào có thể được thực hiện ..

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

1

Giải pháp này rất đơn giản

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

        }
    });
   }
}

--------> xem trước <---------


1

Hãy thử theo lớp tùy chỉnh để sao chép và dán vào 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) {

    }
}

}


1

Đối với điện thoại thông minh với clipboard, có thể ngăn chặn như thế này.

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


0

Tôi thấy rằng khi bạn tạo bộ lọc đầu vào để tránh nhập các ký tự không mong muốn, việc dán các ký tự đó vào văn bản chỉnh sửa sẽ không có hiệu lực. Vì vậy, loại này cũng giải quyết vấn đề của tôi.



0

Giải pháp hiệu quả với tôi là tạo Edittext tùy chỉnh và ghi đè phương thức sau:

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

}


0

Thử sử dụng.

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

0

Ai đang tìm kiếm một giải pháp trong Kotlin sử dụng lớp bên dưới làm tiện ích tùy chỉnh và sử dụng nó trong xml.

lớp 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
    }
}

}


0

tôi đã thêm Chức năng mở rộng trong ngôn ngữ 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?) {
        }
    })
}

bạn có thể sử dụng nó như thế này:

edit_text.disableTextSelection()

cũng được thêm vào dòng dưới đây trong xml của bạn:

                android:longClickable="false"
                android:textIsSelectable="false"
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.