温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

EditText控件如何自定义撤销操作

发布时间:2024-08-20 16:55:21 来源:亿速云 阅读:81 作者:小樊 栏目:移动开发

要自定义EditText控件的撤销操作,可以使用SpannableStringBuilder和TextWatcher来实现。以下是一个示例代码:

public class CustomEditText extends AppCompatEditText {
    private Stack<CharSequence> mUndoStack = new Stack<>();
    private Stack<CharSequence> mRedoStack = new Stack<>();

    public CustomEditText(Context context) {
        super(context);
        init();
    }

    public CustomEditText(Context context, AttributeSet attrs) {
        super(context, attrs);
        init();
    }

    public CustomEditText(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init();
    }

    private void init() {
        addTextChangedListener(new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {
                // do nothing
            }

            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {
                mUndoStack.push(new SpannableStringBuilder(s));
                mRedoStack.clear();
            }

            @Override
            public void afterTextChanged(Editable s) {
                // do nothing
            }
        });
    }

    public void undo() {
        if (!mUndoStack.isEmpty()) {
            CharSequence currentText = getText();
            mRedoStack.push(new SpannableStringBuilder(currentText));

            Editable editable = getText();
            editable.clear();
            editable.append(mUndoStack.pop());
        }
    }

    public void redo() {
        if (!mRedoStack.isEmpty()) {
            CharSequence currentText = getText();
            mUndoStack.push(new SpannableStringBuilder(currentText));

            Editable editable = getText();
            editable.clear();
            editable.append(mRedoStack.pop());
        }
    }
}

在这个自定义EditText控件中,我们使用两个栈来保存撤销和重做的操作。在TextWatcher中,每当文字发生改变时,我们将当前的文字内容保存到撤销栈中。通过调用undo()和redo()方法,可以实现撤销和重做操作。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI