如何在EditText中执行重做撤消操作

Aam*_*han 5 android

我想知道是否有任何方法或任何链接或教程在Android edittext中执行重做撤消操作.如果有人知道,请告诉我.

fat*_*ire 5

关于Antti-Brax / Divers(Kidinov ) 解决方案的快速说明。它工作得很好,除非你尝试将它与 API 23 之后的 TextView 一起使用,你会遇到问题,因为猜猜看,Google 实际上添加了一个隐藏的UndoManager (android.content.UndoManager) 并且没有记录它或者让它明显地存在。但是,如果您有 Marshmallow 或 Nougat 中的硬/蓝牙键盘并按 ^Z 或 SHIFT-^Z,您将获得撤消/重做。

如果您已经将 Antti-Brax 的类与 EditText 一起使用,并且还将其连接到 ^Z 和 shift-^Z,那么问题就会出现,任何使用硬键盘的人都会遇到问题。也就是说,^Z 将同时触发本机和 Antti-Brax 的撤消,导致同时进行两个撤消,这是不好的。经过几次之后,您可能会遇到 Spannable 越界崩溃。

我发现的一个可能的解决方案是对 TextView/TextEdit/whatever 进行子类化,并拦截来自 TextView 的撤消/重做调用,这样它们就不会按如下方式运行:

    @Override
    public boolean onTextContextMenuItem(int id) {
        int ID_UNDO, ID_REDO;

        try {
            ID_UNDO = android.R.id.undo;
            ID_REDO = android.R.id.redo;
        } catch (Resources.NotFoundException e) {
            ID_UNDO = 16908338; // 0x1020032
            ID_REDO = 16908339; // 0x1020033
        }
        return !((id == ID_UNDO) || (id == ID_REDO)) && super.onTextContextMenuItem(id);
    }
Run Code Online (Sandbox Code Playgroud)

这些神奇的 id 数字可在此处找到,并且仅在未找到 android.R.id.undo 值时用作备份。(也可以合理地假设,如果值不存在,则功能不存在,但无论如何......)

这不是最好的解决方案,因为两个撤消跟踪器仍然存在并且都在后台运行。但至少你不会用 ^Z 同时触发它们。这是我能想到的最好的办法,直到这得到正式记录并且 TextView 的 getUndoManager() 方法不再隐藏......

为什么他们在发布的 Android 中创建了一个你无法关闭(甚至不知道它是否存在)的功能,我不能说。

如果有人想关注的话,我刚刚在 Android 的问题跟踪器上打开了一个问题。


小智 3

http://credentiality-android-scripting.googlecode.com/hg/android/ScriptingLayerForAndroid/src/com/googlecode/android_scripting/activity/ScriptEditor.java中有一个针对Android EditText的撤消/重做的实现

该代码可以工作,但不能正确处理配置更改。我正在努力修复,完成后将在此处发布。

我的谷歌搜索是:- android edittext onTextChanged undo

  • 答案中的链接不再存在。 (3认同)