EditText에서 복사 / 붙여 넣기를 비활성화하는 방법


131

내 응용 프로그램에는 사용자가 텍스트를 EditText필드 에 복사 / 붙여 넣기를 원하지 않는 등록 화면이 있습니다 . 복사 / 붙여 넣기 / 입력 방법 및 기타 옵션을 표시하는 상황에 맞는 메뉴가 표시되지 않도록 onLongClickListener각각 을 설정 EditText했습니다. 따라서 사용자는 편집 필드에 복사 / 붙여 넣기를 할 수 없습니다.

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

그러나 사용자가 Android 기본값 이외의 타사 키보드를 사용하도록 설정하면 복사 / 붙여 넣기 버튼이 있거나 동일한 상황에 맞는 메뉴가 표시 될 수 있습니다. 그렇다면 해당 시나리오에서 복사 / 붙여 넣기를 어떻게 비활성화합니까?

복사 / 붙여 넣기 방법이 더 있으면 알려주세요. (그리고 아마도 그들을 비활성화하는 방법)

도움을 주시면 감사하겠습니다.


"붙여 넣기"작업이 IME에서 비롯된 경우 일반적인 키 입력과 구별 할 표준 방법이 없습니다. 시도해야 할 한 가지 아이디어는 각 문자의 도착 시간을 측정하는 것이며 시간이 너무 짧은 경우 문자는 "붙여 넣기"작업에서 오는 것입니다.
BitBank

더러운 soloution 것 같습니다! 그래도 볼만한 가치가 있습니다.
rDroid

1
android : longClickable = "false"사용
Azay Gupta

답변:


112

API 레벨 11 이상을 사용하는 경우 복사, 붙여 넣기, 잘라 내기 및 사용자 정의 컨텍스트 메뉴가 표시되는 것을 중지 할 수 있습니다.

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

onCreateActionMode (ActionMode, Menu)에서 false를 반환하면 동작 모드가 시작되지 않습니다 (모두 선택, 잘라 내기, 복사 및 붙여 넣기 동작).


1
13 이하의 API 레벨은 어떻습니까?
Jonathan

1
그나마이 중 의견을 이해하고,이 샘플은 api11 +, 사전 api11이 IIRC 복사 및 붙여 넣기 거기 있었다 일
scottyab

28
파란색 커서 표시기를 두드리면 붙여 넣기 버튼이 나타납니다.
void

8
또한 나를 위해 일하지 않습니다. 두 번 탭하면 복사-붙여 넣기 메뉴가 표시됩니다.
Android Killer

이것은 안드로이드 6.0에서 더 이상 작동하지 않습니다.이 답변을 확인하십시오 stackoverflow.com/questions/27869983/…
has19

132

가장 좋은 방법은 다음을 사용하는 것입니다.

etUsername.setLongClickable(false);

58
또는, 그냥 xml android:longClickable="false":)
lomza

19
파란색 커서 표시기를 두드리면 붙여 넣기 버튼이 나타납니다.
void

16
이렇게하면 뷰를 길게 클릭 할 수 없게되지만 텍스트를 두 번 눌러 편집 컨트롤을 요청할 수도 있습니다. 이는이 솔루션이 완료되지 않았 음을 의미합니다. 당신의 목적을 위해 이것을 명심하십시오.
Kevin Grant

1
또한 키보드 단축키는 여전히 외부 키보드와 함께 작동 할 수 있습니다 (Ctrl + C).
Oleg Vaskevich

텍스트를 두 번 두드 리거나 길게 두드리면 클립 보드 옵션을 열 수 있기 때문에 아이스크림 샌드위치에서는 작동하지 않습니다.
폴 윈츠

44

EditText를 길게 누르면 비활성화 할 수 있습니다

그것을 구현하려면 xml에 다음 줄을 추가하십시오.

android:longClickable="false"

6
문제는 내 앱 사용자에게 복사 및 붙여 넣기 버튼이있는 타사 키보드가 있다는 것입니다.
rDroid

3
또 다른 문제는 더블 탭으로 텍스트를 선택할 수 있고 다시 복사 / 붙여 넣기를 표시한다는 것입니다.
Nikola

37

다음과 같이 복사하여 붙여 넣기 기능을 비활성화 할 수 있습니다.

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

그것이 당신을 위해 작동하기를 바랍니다 ;-)


이것은 위의 다른 답변을 기반으로 한 것과 똑같은 솔루션입니다. 그것은 다른 사람하지 가장자리 경우를 처리하기 때문에 이것은 올바른 솔루션으로 표시되어야합니다
앤드류 Hoefling

2
이 옵션은 사본을 차단하지만 커서를 클릭하여 붙여 넣기를 계속할 수 있습니다.
Mehul Kanzariya

12

모든 버전에서 editText 작업의 잘라 내기 복사 붙여 넣기를 비활성화하는 가장 좋은 방법은 다음과 같습니다.

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

나를 위해 일한이는 그냥 @TargetApi (Build.VERSION_CODES.HONEYCOMB)를 추가했다
Sheepdogsheep

11

setCustomSelectionActionModeCallback비활성화 된 긴 클릭 솔루션 외에도 아래 이미지에 따라 텍스트 선택 핸들을 클릭 할 때 PASTE / REPLACE 메뉴 가 나타나지 않도록해야 합니다.

붙여 넣기 메뉴가있는 텍스트 선택 핸들

해결책은 PASTE / REPLACE 메뉴 show()가 (문서화되지 않은) android.widget.Editor클래스 의 메소드에 나타나지 않도록하는 것입니다 . 메뉴가 나타나기 전에 확인을 수행합니다 if (!canPaste && !canSuggest) return;. 이러한 변수를 설정하는 기초로 사용되는 두 가지 방법은 모두 EditText클래스에 있습니다.

보다 자세한 답변은 여기에서 볼 수 있습니다 .


이것은
정확

클립 보드 붙여 넣기 대신 일부 장치에서 붙여 넣기 옵션이 표시됩니다. 링크를 확인했지만 클립 보드가 아닌 붙여 넣기를 방지 할 수 있습니다. 어떤 아이디어?
Richa

10

코 틀린 솔루션 :

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

그런 다음 간단히이 메소드를 다음에서 호출 할 수 있습니다 TextView.

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

1
안녕하세요,이 접근법을 사용하고 있지만 이 부분 Type mismatch에서이 설명 Required:ActionMode.Callback! Found: 에 오류가 object: ActionMode.Callback있습니다. 왜 작동하지 않을 수 있습니까?
Abdul Mateen

8

다른 솔루션을 사용하여 API 26 (Oreo)은 입력 한 텍스트를 한 번 탭하여 여전히 커서 핸들을 표시했으며 메뉴를 표시 할 수 있습니다. 솔루션 조합만이 내 문제를 해결할 수 있습니다.

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

긴 클릭을 비활성화하지 않으려는 경우 true를 반환하는 것보다 긴 클릭에서 일부 기능을 수행해야하므로 true를 반환하는 것이 좋습니다.

편집 텍스트 긴 클릭은 다음과 같습니다.

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

당으로 문서 "참"을 반환하면 긴 클릭이 처리되어 기본 작업을 수행 할 필요가 없음을 나타냅니다.

나는 이것을 API 레벨 16, 22 및 25에서 테스트했습니다. 그것은 잘 작동합니다. 이것이 도움이되기를 바랍니다.


1
좋아요 또는 android:longClickable="false"XML로 설정
Alex Semeniuk

3

https://github.com/neopixl/PixlUIEditText메소드를 제공합니다

myEditText.disableCopyAndPaste().

그리고 그것은 오래된 API에서 작동합니다.


1
이것은 stackoverflow.com/a/22756538/3063884에서 제공하는 반 솔루션과 정확히 동일합니다 . 코드를 참조하십시오 : github.com/neopixl/PixlUI/blob/master/Library/src/com/neopixl/… ...이 방법은 클립 보드에 텍스트가있는 경우 텍스트 선택 핸들러가 "PASTE"를 표시하지 못하게합니다 .
CJBS

3

다음은 "붙여 넣기"팝업을 비활성화하는 해킹입니다. EditText메소드 를 대체해야합니다 .

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

다른 작업에서도 비슷한 작업을 수행 할 수 있습니다.


클립 보드 비활성화
Richa

3

이 솔루션을 테스트했으며 작동합니다.

    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

클립 보드를 읽고 입력과 입력이 "입력 된"시간을 확인하십시오. 클립 보드의 텍스트가 같고 너무 빠르면 붙여 넣은 입력을 삭제하십시오.


1

@ Zain Ali, 귀하의 답변은 API 11에서 작동합니다. API 10에서도 수행 할 수있는 방법을 제안하고 싶었습니다. 해당 버전에서 프로젝트 API를 유지 관리해야했기 때문에 2.3.3에서 사용할 수있는 기능을 지속적으로 사용하여이를 수행 할 수있었습니다. 아래 스 니펫을 공유했습니다. 나는 코드를 테스트했고 그것은 나를 위해 일하고 있었다. 나는이 발췌 문장을 긴급하게했다. 수행 할 수있는 변경 사항이 있으면 코드를 개선하십시오.

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

해결책은 매우 간단합니다

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

        }
    });
   }
}

--------> 미리보기 <---------


1

프리 벤트 복사 및 붙여 넣기를 위해 다음 custome 클래스를 사용해보십시오. 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

클립 보드 부착 스마트 폰의 경우, 이와 같이 방지 할 수 있습니다.

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

원치 않는 문자가 입력되는 것을 피하기 위해 입력 필터를 만들 때 해당 문자를 편집 텍스트에 붙여 넣는 것은 효과가 없다는 것을 알았습니다. 그래서 이런 종류의 문제도 해결됩니다.


0

android : focusableInTouchMode = "false"를 사용해보십시오.


그것은 작동하지 않습니다
Ragavendra M

0

나를 위해 일한 해결책은 사용자 정의 편집 텍스트를 만들고 다음 방법을 재정의하는 것입니다.

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

사용하십시오.

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

Kotlin에서 솔루션을 찾는 사람은 아래 클래스를 사용자 정의 위젯으로 사용하고 xml에서 사용합니다.

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

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

다음과 같이 사용할 수 있습니다.

edit_text.disableTextSelection()

xml에서 아래 줄을 추가했습니다.

                android:longClickable="false"
                android:textIsSelectable="false"
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.