关于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
| 归档时间: |
|
| 查看次数: |
5475 次 |
| 最近记录: |