Android实现undo/redo功能

本文详细介绍了在Android应用中实现EditText和RecyclerView组件的undo/redo功能,包括功能设计、体验地址、功能实现步骤,以及如何处理外部键盘快捷键和控件焦点变化时的undo/redo状态同步。
摘要由CSDN通过智能技术生成

一、目标

实现编辑器的undo/redo功能。
在这里插入图片描述

二、体验地址

神马笔记最新版本:【神马笔记 版本1.4.0.apk

三、功能设计

功能设计要求:

  1. 实现undo/redo功能
  2. 显示undo/redo状态,操作无法执行时,必须显示为不可用状态
  3. 支持从外部键盘通过快捷键执行undo/redo
  4. 外部键盘与操作按钮的操作行为必须同步

四、准备工作

在上一篇文章中,已经介绍了Android的EditText控件如何实现undo/redo功能。

具体内容详见《EditText实现undo/redo功能》。

需要注意的是,图文混排的实现方式采用的是RecyclerView的方式,当插入图片时,其实是创建了多个EditText控件,而不是单个EditText控件。所以,无法通过undo功能撤销插入图片的操作。仅仅局限于EditText的文本操作。

与此同时,正如Editor中的一段注释所描述的,无法撤销Span操作,目前只能处理文本内容的变化。

/**
 * An InputFilter that monitors text input to maintain undo history. It does not modify the
 * text being typed (and hence always returns null from the filter() method).
 *
 * TODO: Make this span aware.
 */

五、组合起来

1. UndoEditor

TextViewUtils的功能再次进行封装。

2. ParagraphEdit

EditText再次封装,使之直接支持undo/redo。

3. UndoHelper

功能设计2要求——显示undo/redo状态,操作无法执行时,必须显示为不可用状态。

同时一篇文章可能有1个或多个EditText组成。

因此,在EditText切换焦点时,必须更新undo/redo按钮状态,以指示操作是否可以执行。

OnGlobalFocusChangeListener可以监听焦点控件的变化,从而实现这个功能。

另外,当EditText文字内容发生变化时,同样需要更新按钮状态。

我们使用TextWatcher来完成这个功能。

public class UndoHelper implements LifecycleObserver,
        ViewTreeObserver.OnGlobalFocusChangeListener,
        ViewTreeObserver.OnGlobalLayoutListener,
        TextWatcher {
   

    View decorView;

    View undoBtn;
    View redoBtn;

    Fragment parent;

    public UndoHelper(Fragment f, View undoBtn, View redoBtn) {
   
        this.parent = f;
        f.getLifecycle().addObserver(this);

        this.undoBtn = undoBtn;
        undoBtn.setEnabled(false);
        undoBtn.setOnClickListener(this::onUndoClick);

  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值