@RitcheeQinG
2020-08-11T03:18:58.000000Z
字数 2231
阅读 486
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() {
@Override
public boolean onCreateActionMode(ActionMode mode, Menu menu) {
return true;
}
@Override
public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
return false;
}
@Override
public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
if (item.getItemId() == android.R.id.copy) {
onDoCopy(editText);
return true;
}
return false;
}
@Override
public 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));
}
}
}