@RitcheeQinG
2020-08-11T03:18:58.000000Z
字数 2231
阅读 560
Android
出现原因大概是Oppo搞幺蛾子,特定机型 + 安卓版本下,复制时弹Toast导致报错,具体原因搞不清楚,仅提供一个解决办法:
不走系统的复制方法,我们手动实现复制
这里懒得认真写了,上代码
import android.content.ClipData;import android.content.ClipboardManager;import android.content.Context;import android.os.Build;import android.text.Editable;import android.view.ActionMode;import android.view.Menu;import android.view.MenuItem;import android.widget.EditText;/*** 本类为了处理部分Oppo手机(R9s, R11等)在特定安卓版本(6.0.1, 7.1.1等)* EditText复制文字时出现的crash* 部分报错信息:* android.view.InflateException: Binary XML file line #27: Binary XML file line #27: Error inflating class TextView* Caused by: android.view.InflateException: Binary XML file line #27: Error inflating class TextView* Caused by: java.lang.ArrayIndexOutOfBoundsException: length=16; index=4400*/public class OppoEditTextOptimizer {private static final String BRAND_OPPO = "oppo";public static void optimize(EditText editText) {if (isOppoOptimizeEnabled()) {setCustomCopyAction(editText);}}private static boolean isOppoOptimizeEnabled() {String brand = Build.BRAND;if (null != brand) {if (!BRAND_OPPO.equals(brand.toLowerCase())) {return false;}return Build.VERSION.SDK_INT <= Build.VERSION_CODES.N_MR1;}return false;}/*** 屏蔽掉官方默认的复制实现,改为手动实现复制粘贴功能*/private static void setCustomCopyAction(EditText editText) {editText.setCustomSelectionActionModeCallback(new ActionMode.Callback() {@Overridepublic boolean onCreateActionMode(ActionMode mode, Menu menu) {return true;}@Overridepublic boolean onPrepareActionMode(ActionMode mode, Menu menu) {return false;}@Overridepublic boolean onActionItemClicked(ActionMode mode, MenuItem item) {if (item.getItemId() == android.R.id.copy) {onDoCopy(editText);return true;}return false;}@Overridepublic void onDestroyActionMode(ActionMode mode) {}});}private static void onDoCopy(EditText editText) {ClipboardManager manager = (ClipboardManager)editText.getContext().getSystemService(Context.CLIPBOARD_SERVICE);if (null != manager) {final int selStart = editText.getSelectionStart();final int selEnd = editText.getSelectionEnd();int min = Math.max(0, Math.min(selStart, selEnd));int max = Math.max(0, Math.max(selStart, selEnd));Editable edit = editText.getText();String text = null == edit ? "" : edit.toString();String selectedText = text.isEmpty() ? "" : text.substring(min, max);final ClipData copyData = ClipData.newPlainText(null, selectedText);manager.setPrimaryClip(new ClipData(copyData));}}}