BoBoMEe / Mentions

mention string(@xxxx,#xxx#,links) support EditText ,TextView for Android

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

当edittext文字太多时,并且包含话题时,长按键盘删除按钮删除太快导致崩溃问题解决

wzhangmoumou opened this issue · comments

测试过程中发现在华为和vivo上级上出现这个问题,小米手机上没事。
出现问题的原因是,达到快速删除的时候,vivo手机上会一次删除两个字符,华为手机上就***

贴上解决代码,直接修改MentionInputConnection类sendKeyEvent就可以

` private int lastStart=-1;
private int lastend=-1;

@OverRide public boolean sendKeyEvent(KeyEvent event) {
if (event.getAction() == KeyEvent.ACTION_DOWN && event.getKeyCode() == KeyEvent.KEYCODE_DEL) {
if (null != mRangeManager) {
int selectionStart = mEditText.getSelectionStart();
int selectionEnd = mEditText.getSelectionEnd();
if (lastStart==selectionStart && lastend==selectionEnd){
return true;
}
Range closestRange =
mRangeManager.getRangeOfClosestMentionString(selectionStart, selectionEnd);

      if (closestRange == null) {
        mEditText.setSelected(false);
        if (selectionStart>0) {
          mEditText.getEditableText().delete(selectionStart - 1, selectionEnd);
          return true;
        }else {
          mEditText.setSelected(false);
          return super.sendKeyEvent(event);
        }
      }
      //if mention string has been selected or the cursor is at the beginning of mention string, just use default action(delete)
      if (mEditText.isSelected() || selectionStart == closestRange.getFrom()) {
        mEditText.setSelected(false);
       lastStart=selectionStart;
       lastend=selectionEnd;
        return super.sendKeyEvent(event);
      } else {
        //select the mention string
          if (isDeletable) {//可以删除,否则不进行处理
            mEditText.setSelected(true);
            mRangeManager.setLastSelectedRange(closestRange);
            setSelection(closestRange.getTo(), closestRange.getFrom());
        }
      }
      return true;
  }
}
return super.sendKeyEvent(event);

}
`

大佬牛批,我也遇到这个崩溃了,学习一波!

@zombiu @wzhangmoumou 请问 isDeletable 这个值是怎么判断的

https://github.com/zombiu/Study_Demo/blob/master/Study_RichText/mentions/src/main/java/com/bobomee/android/mentions/edit/listener/MentionInputConnection.java
我根据大佬的思路,做了一下拦截!

我试了一下,删除的时候还是在 setSelection(closestRange.getTo(), closestRange.getFrom()); 这个地方崩溃,请问您那边会这样吗

https://github.com/zombiu/Study_Demo/blob/master/Study_RichText/mentions/src/main/java/com/bobomee/android/mentions/edit/listener/MentionInputConnection.java
我根据大佬的思路,做了一下拦截!

我试了一下,删除的时候还是在 setSelection(closestRange.getTo(), closestRange.getFrom()); 这个地方崩溃,请问您那边会这样吗

不会,这个功能已经上线几个月了,从来没出现过相关崩溃。

https://github.com/zombiu/Study_Demo/blob/master/Study_RichText/mentions/src/main/java/com/bobomee/android/mentions/edit/listener/MentionInputConnection.java
我根据大佬的思路,做了一下拦截!

我试了一下,删除的时候还是在 setSelection(closestRange.getTo(), closestRange.getFrom()); 这个地方崩溃,请问您那边会这样吗

不会,这个功能已经上线几个月了,从来没出现过相关崩溃。
这个截图是我用您的demo在我手机上测试的,也是相同的问题。我使用的手机 oppo A3 Android版本:10。
56F4BC40-22A1-43FE-97CE-A44265734FBC

https://github.com/zombiu/Study_Demo/blob/master/Study_RichText/mentions/src/main/java/com/bobomee/android/mentions/edit/listener/MentionInputConnection.java
我根据大佬的思路,做了一下拦截!

我试了一下,删除的时候还是在 setSelection(closestRange.getTo(), closestRange.getFrom()); 这个地方崩溃,请问您那边会这样吗

不会,这个功能已经上线几个月了,从来没出现过相关崩溃。
这个截图是我用您的demo在我手机上测试的,也是相同的问题。我使用的手机 oppo A3 Android版本:10。
56F4BC40-22A1-43FE-97CE-A44265734FBC

我这边复现不了丫,不能复现,我也不知道咋整!

https://github.com/zombiu/Study_Demo/blob/master/Study_RichText/mentions/src/main/java/com/bobomee/android/mentions/edit/listener/MentionInputConnection.java
我根据大佬的思路,做了一下拦截!

我试了一下,删除的时候还是在 setSelection(closestRange.getTo(), closestRange.getFrom()); 这个地方崩溃,请问您那边会这样吗

不会,这个功能已经上线几个月了,从来没出现过相关崩溃。
这个截图是我用您的demo在我手机上测试的,也是相同的问题。我使用的手机 oppo A3 Android版本:10。
56F4BC40-22A1-43FE-97CE-A44265734FBC

我这边复现不了丫,不能复现,我也不知道咋整!
我翻到的最开始项目的issues,他是将setSelection(closestRange.from,closestRange.to);这个方法中的值互换了一下位置,您可以试一下看看。
andydevacc/MentionEditText#4

https://github.com/zombiu/Study_Demo/blob/master/Study_RichText/mentions/src/main/java/com/bobomee/android/mentions/edit/listener/MentionInputConnection.java
我根据大佬的思路,做了一下拦截!

我试了一下,删除的时候还是在 setSelection(closestRange.getTo(), closestRange.getFrom()); 这个地方崩溃,请问您那边会这样吗

不会,这个功能已经上线几个月了,从来没出现过相关崩溃。
这个截图是我用您的demo在我手机上测试的,也是相同的问题。我使用的手机 oppo A3 Android版本:10。
56F4BC40-22A1-43FE-97CE-A44265734FBC

我这边复现不了丫,不能复现,我也不知道咋整!
我翻到的最开始项目的issues,他是将setSelection(closestRange.from,closestRange.to);这个方法中的值互换了一下位置,您可以试一下看看。
andydevacc/MentionEditText#4

你那边改了能修复吗,要是可以的话,你就这样修改吧!

https://github.com/zombiu/Study_Demo/blob/master/Study_RichText/mentions/src/main/java/com/bobomee/android/mentions/edit/listener/MentionInputConnection.java
我根据大佬的思路,做了一下拦截!

我试了一下,删除的时候还是在 setSelection(closestRange.getTo(), closestRange.getFrom()); 这个地方崩溃,请问您那边会这样吗

不会,这个功能已经上线几个月了,从来没出现过相关崩溃。
这个截图是我用您的demo在我手机上测试的,也是相同的问题。我使用的手机 oppo A3 Android版本:10。
56F4BC40-22A1-43FE-97CE-A44265734FBC

我这边复现不了丫,不能复现,我也不知道咋整!
我翻到的最开始项目的issues,他是将setSelection(closestRange.from,closestRange.to);这个方法中的值互换了一下位置,您可以试一下看看。
andydevacc/MentionEditText#4

你那边改了能修复吗,要是可以的话,你就这样修改吧!

我这样是可以的,暂时没有发现其他问题。感谢您的回复!

https://github.com/zombiu/Study_Demo/blob/master/Study_RichText/mentions/src/main/java/com/bobomee/android/mentions/edit/listener/MentionInputConnection.java
我根据大佬的思路,做了一下拦截!

我试了一下,删除的时候还是在 setSelection(closestRange.getTo(), closestRange.getFrom()); 这个地方崩溃,请问您那边会这样吗

不会,这个功能已经上线几个月了,从来没出现过相关崩溃。
这个截图是我用您的demo在我手机上测试的,也是相同的问题。我使用的手机 oppo A3 Android版本:10。
56F4BC40-22A1-43FE-97CE-A44265734FBC

我这边复现不了丫,不能复现,我也不知道咋整!
我翻到的最开始项目的issues,他是将setSelection(closestRange.from,closestRange.to);这个方法中的值互换了一下位置,您可以试一下看看。
andydevacc/MentionEditText#4

你那边改了能修复吗,要是可以的话,你就这样修改吧!

我这样是可以的,暂时没有发现其他问题。感谢您的回复!

报的是Fatal Exception: java.lang.IllegalArgumentException这个错误么,我仔细检查了下崩溃情况,有一例崩溃跟你发出来的类似!

https://github.com/zombiu/Study_Demo/blob/master/Study_RichText/mentions/src/main/java/com/bobomee/android/mentions/edit/listener/MentionInputConnection.java
我根据大佬的思路,做了一下拦截!

我试了一下,删除的时候还是在 setSelection(closestRange.getTo(), closestRange.getFrom()); 这个地方崩溃,请问您那边会这样吗

不会,这个功能已经上线几个月了,从来没出现过相关崩溃。
这个截图是我用您的demo在我手机上测试的,也是相同的问题。我使用的手机 oppo A3 Android版本:10。
56F4BC40-22A1-43FE-97CE-A44265734FBC

我这边复现不了丫,不能复现,我也不知道咋整!
我翻到的最开始项目的issues,他是将setSelection(closestRange.from,closestRange.to);这个方法中的值互换了一下位置,您可以试一下看看。
andydevacc/MentionEditText#4

你那边改了能修复吗,要是可以的话,你就这样修改吧!

我这样是可以的,暂时没有发现其他问题。感谢您的回复!

报的是Fatal Exception: java.lang.IllegalArgumentException这个错误么,我仔细检查了下崩溃情况,有一例崩溃跟你发出来的类似!

39235C0C-05FF-4E1E-8E56-C2D70EB5F2FA
就是这个错误。我留一下联系方式这样聊太麻烦了QQ:1538800174

https://github.com/zombiu/Study_Demo/blob/master/Study_RichText/mentions/src/main/java/com/bobomee/android/mentions/edit/listener/MentionInputConnection.java
我根据大佬的思路,做了一下拦截!

我试了一下,删除的时候还是在 setSelection(closestRange.getTo(), closestRange.getFrom()); 这个地方崩溃,请问您那边会这样吗

不会,这个功能已经上线几个月了,从来没出现过相关崩溃。
这个截图是我用您的demo在我手机上测试的,也是相同的问题。我使用的手机 oppo A3 Android版本:10。
56F4BC40-22A1-43FE-97CE-A44265734FBC

我这边复现不了丫,不能复现,我也不知道咋整!
我翻到的最开始项目的issues,他是将setSelection(closestRange.from,closestRange.to);这个方法中的值互换了一下位置,您可以试一下看看。
andydevacc/MentionEditText#4

你那边改了能修复吗,要是可以的话,你就这样修改吧!

我这样是可以的,暂时没有发现其他问题。感谢您的回复!

报的是Fatal Exception: java.lang.IllegalArgumentException这个错误么,我仔细检查了下崩溃情况,有一例崩溃跟你发出来的类似!

39235C0C-05FF-4E1E-8E56-C2D70EB5F2FA
就是这个错误。我留一下联系方式这样聊太麻烦了QQ:1538800174

谢谢大佬回复,加你了!