EditText一些功能的屏蔽和实现方法

545 阅读1分钟

屏蔽复制粘贴

editText.setCustomSelectionActionModeCallback(new ActionMode.Callback() {
    @Override
    public boolean onCreateActionMode(ActionMode mode, Menu menu) {
        return false;
    }

    @Override
    public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
        return false;
    }

    @Override
    public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
        return false;
    }

    @Override
    public void onDestroyActionMode(ActionMode mode) {

    }
});

屏蔽点击时显示的小水滴

屏蔽如下图所示的小水滴

image.png

editText.setTextSelectHandle(new ColorDrawable());

屏蔽双击双中

image.png

editText.setMovementMethod(new BaseMovementMethod() {
    @Override
    public void initialize(TextView widget, Spannable text) {
        // 参考 ArrowKeyMovementMethod#initialize,如果不设置的话,会导致length=0时,不显示cursor
        Selection.setSelection(text, 0);
    }
});

动态更新光标颜色

可利用DrawableWrapper实现

DrawableWrapper cursorDrawableWrapper = new DrawableWrapper(null) {};
editText.setTextCursorDrawable(cursorDrawableWrapper);
// 这里换成要更换的Drawable
cursorDrawableWrapper.setDrawable(new ColorDrawable(Color.RED));
cursorDrawableWrapper.setDrawable(new ColorDrawable(Color.GREEN));

将显示文字显示为*

editText.setTransformationMethod(new AsteriskPasswordTransformationMethod());

AsteriskPasswordTransformationMethod实现如下:

public static class AsteriskPasswordTransformationMethod extends PasswordTransformationMethod {
    @Override
    public CharSequence getTransformation(CharSequence source, View view) {
        return new PasswordCharSequence(source);
    }
}

private static class PasswordCharSequence implements CharSequence {
    private final CharSequence origin;
    public PasswordCharSequence(CharSequence charSequence) {
        origin = charSequence;
    }

    @Override
    public int length() {
        return origin.length();
    }

    @Override
    public char charAt(int index) {
        return '*';
    }

    @NonNull
    @Override
    public CharSequence subSequence(int start, int end) {
        return origin.subSequence(start, end);
    }
}

设置了MovementMethod之后不显示光标

需要在initialize方法中手动调用下Selection#setSelection方法

editText.setMovementMethod(new BaseMovementMethod() {
    @Override
    public void initialize(TextView widget, Spannable text) {
        // 参考 ArrowKeyMovementMethod#initialize,如果不设置的话,会导致length=0时,不显示cursor
        Selection.setSelection(text, 0);
    }
});