如何在Android中通过按钮点击将“撤销”和“重做”操作应用于EditText?

4
我将尝试在写作或应用EditText效果时应用撤销和重做操作。为此,我从Link下载了一个类,并在我的应用程序中使用它。 撤销操作:
TextViewUndoRedo mTextViewUndoRedo = new TextViewUndoRedo(edtNoteDescription);
mTextViewUndoRedo.undo();

关于重做

TextViewUndoRedo mTextViewUndoRedo = new TextViewUndoRedo(edtNoteDescription);
mTextViewUndoRedo.redo();

但是我不知道为什么这段代码不起作用,我已经记录了日志并检查了函数Undo是否被调用,不幸的是我发现它确实被调用了,但是进入了下面的方法。

if (edit == null) {
    return;
}

我已尝试使用其他解决方案,但没有成功。因此,如果有人使用此方法或任何其他方法实现了相同的功能,请建议一些代码或方法来实现此功能。 编辑
btnUndo.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                 TextViewUndoRedo mTextViewUndoRedo = new TextViewUndoRedo(edtNoteDescription);
                 mTextViewUndoRedo.undo();
            }
        });

1
你可以使用队列或栈来实现自己的“撤销/重做”功能... - nem035
getPrevious()方法返回null,因为EditHistory内部的mmPosition是0。这意味着历史记录是空的。你是否在一个空的编辑文本上调用了undo操作? - nem035
@nem,首先感谢您的回复。不,我没有在空的EditText上应用撤消操作。另一件事是,在执行操作之后,为什么EditHistory为0?我不明白。 - InnocentKiller
EditHistory 中的 mmPosition 是 0,而不是 EditHistory 本身。Undo() 方法调用 EditItem edit = mEditHistory.getPrevious();,并且正如您所说,editnull。这意味着 getPrevious() 返回了 null。在 getPrevious() 中,执行语句 if (mmPosition == 0) { return null; },因此 mmPosition 必须为 0。当 EditHistory.mmHistory 为空时,这是正确的,因此我假设您正在对空的 EditText 应用此操作。您能否发布一段更大的代码,显示您如何按照什么顺序调用这些方法? - nem035
@nem,我只是在按钮的点击事件中使用了上面的代码,没有别的操作。这个类本身可以从我给出的链接中下载。为了让你更好地理解,我已经粘贴了我的代码,说明我如何在我的类中使用它。 - InnocentKiller
如果你找不到这个类的话,可以通过以下链接找到它:https://github.com/jtbuaa/iReaderHome/blob/master/app/src/main/java/fi/iki/asb/android/logo/TextViewUndoRedo.java - coolcool1994
1个回答

4

问题可能是您每次单击按钮时都创建了 TextViewUndoRedo 对象。

这就是为什么 EditHistory 是空的原因,因为它每次都会被重新创建。难道不会这样工作吗?

TextViewUndoRedo mTextViewUndoRedo = new TextViewUndoRedo(edtNoteDescription);

btnUndo.setOnClickListener(new OnClickListener() {
    @Override
    public void onClick(View v) {
        mTextViewUndoRedo.undo();
    }
});

正如我在评论中所说,Undo()方法调用mEditHistory.getPrevious(),但是getPrevious()返回null,因为它内部执行了:

if (mmPosition == 0) { 
    return null; 
} 

创建 TextViewUndoRedo 时,会创建一个新的 EditHistory 对象,并在其中将 mmPosition 初始化为 0。 由于每次重新创建对象,mmPosition 始终为 0,因此您会收到 null

@InnocentKiller 没问题,很高兴能帮助 :) - nem035
Jetpack Compose 中的 TextField 是否支持撤销/重做操作?谢谢。 - Mark Delphi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接