基于EditText实现一个可以对编辑文本进行撤销与返回的文本编辑器

基于EditText实现一个可以对编辑文本进行撤销与返回的文本编辑器

第一步
我们需要一个EditText


    android:id="@id/et_first_schedule"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_weight="1"
    android:background="@null"
    android:gravity="left|top"
    android:hint="@string/note_edit_hint"
    android:inputType="textMultiLine"
    android:textColorHint="@color/colorPrimary"
    android:textSize="25dp"/>
显示如下:
基于EditText实现一个可以对编辑文本进行撤销与返回的文本编辑器_第1张图片

第二步 我们需要有两个按钮 撤销&返回
基于EditText实现一个可以对编辑文本进行撤销与返回的文本编辑器_第2张图片

第三步 逻辑设计

首先我们对EditText中所有的TextChange进行监听 这里使用的是addTextChangedListener()方法进行监听
数据的缓存我们用db来实现
这里使用了一个非常好用了第三方库LitePal 具体操作可以看郭霖大神的详细讲解:
http://blog.csdn.net/guolin_blog/article/details/38556989

把每一次的TextChange都保存在dataBase中

/* @描述 添加空文本 */
etFirstSchedule.addTextChangedListener(new TextWatcher() {
    @Override
    public void beforeTextChanged(CharSequence s, int start, int count, int after) {
    }
    @Override
    public void onTextChanged(CharSequence s, int start, int before, int count) {
    }
    @Override
    public void afterTextChanged(Editable s) {
            if (change) {
            /* @描述 如果不是schedule那么就进行上一步缓存处理 */
                TextPeriousCache textPeriousCache = new TextPeriousCache();
                textPeriousCache.setView_name("etFirstSchedule");
                textPeriousCache.setContent(s.toString());
                textPeriousCache.save();
                LogUtils.Log("完成记录  " + s.toString());
            }
    }
});

第四步 返回点击事件

这里我们建立了连个db table 一个用来作为返回内容的缓存(Table1) 另一个作为撤销内容的缓存(Table2)

点击返回按钮的时候 我们需要在编辑器中显示上一次的文本,也就是缓存中的倒数第二条内容(倒数第一条是当前显示的文本内容)
而对应的数据库的操作设计为 点击一次返回按钮 会获取当前返回缓存Table1中最后一条item然后保存到缓存Table2中
然后删除这一条item后获取最后一条item显示到编辑器中
而这里,我们在把item显示到文本编辑器中的时候也会触发编辑器中的TextChange监听事件
所以我们对监听事件设置一个flag(change)当change为true的时候就进行缓存写入,否则就无法写入缓存

这样可以在每一次点击返回键的时候文本编辑器显示为上一步的文本

所以这一段逻辑应该是这样:

/* @描述 点击返回文字上一步 */
ivNoteEditBack.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        int count = DataSupport.count(TextPeriousCache.class);
        if (count>0) {
            change = false;

            TextPeriousCache last = DataSupport.findLast(TextPeriousCache.class);

            TextNextCache textNextCache = new TextNextCache();
            textNextCache.setView_name(last.getView_name());
            textNextCache.setContent(last.getContent());
            textNextCache.save();
            LogUtils.Log("转存内容 "+last.getContent());

            last.delete();

            if (count==1){
                etFirstSchedule.setText("");
                change = true;
            }else {
                String content = DataSupport.findLast(TextPeriousCache.class).getContent();
                etFirstSchedule.setText(content);
                etFirstSchedule.setSelection(content.length());
                change = true;
            }
        }
    }
});

第五步 撤销点击事件

之前在每一次点击返回按钮的时候会把部分缓存转移到撤销缓存Table2中来
所以在点击撤销按钮的时候,可以理解为把返回按钮的动作反过来执行
所以我们把撤销缓存中的最后一条item也就是当前显示文本的下一步应该显示的文本
所以操作逻辑为table2中最后一条item显示到编辑器中然后转移到table1中
其余判断沿用返回按钮设计
所以代码如下:

/* @描述 点击返回文字下一步 */
ivNoteEditNext.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        int count = DataSupport.count(TextNextCache.class);
        if (count>0) {
            change = false;

            TextNextCache last = DataSupport.findLast(TextNextCache.class);

            TextPeriousCache textPeriousCache = new TextPeriousCache();
            textPeriousCache.setView_name(last.getView_name());
            textPeriousCache.setContent(last.getContent());
            textPeriousCache.save();

            String content = DataSupport.findLast(TextNextCache.class).getContent();
            etFirstSchedule.setText(content);
            etFirstSchedule.setSelection(content.length());

            last.delete();
            change = true;
        }
    }
});


第六步 处理缓存
当然我们要在特定的环节将换粗清理掉
使用LitePal的DB清空就可以了

@Override
protected void onDestroy() {
    /* @描述 删除缓存中的图片内容 */
    DataSupport.deleteAll(ImageCache.class);
    DataSupport.deleteAll(TextPeriousCache.class);
    DataSupport.deleteAll(TextNextCache.class);
    super.onDestroy();
}



一个具有返回 撤销功能的文本编辑器就实现了,感觉还不错。
基于EditText实现一个可以对编辑文本进行撤销与返回的文本编辑器_第3张图片

你可能感兴趣的:(自学)