Xamarin.Android中Editor控件长按触发Java.Lang.RuntimeException问题求助
解决Xamarin.Android中三星S7(Android 7.0)长按Editor控件的空指针异常
你碰到的这个异常是典型的设备+系统版本兼容性问题——在Android 7.0的三星S7上,系统内置的Editor控件在长按触发文本选择逻辑时,内部的SelectionModifierCursorController对象还没完成初始化,就被调用了isDragAcceleratorActive()方法,直接抛出了空指针异常。
下面给你几个可行的解决方案:
方案一:自定义Editor控件捕获异常
通过继承原生Editor控件,重写触摸事件方法,针对性捕获这个特定的空指针异常,避免崩溃:
public class SafeEditor : Editor { public SafeEditor(Context context) : base(context) { } public SafeEditor(Context context, IAttributeSet attrs) : base(context, attrs) { } public SafeEditor(Context context, IAttributeSet attrs, int defStyleAttr) : base(context, attrs, defStyleAttr) { } public override bool OnTouchEvent(MotionEvent e) { try { return base.OnTouchEvent(e); } catch (Java.Lang.NullPointerException ex) { // 只处理我们目标异常,其他空指针正常抛出 if (ex.Message?.Contains("isDragAcceleratorActive") == true) { return true; // 标记事件已处理,避免崩溃 } throw; } } }
之后在布局里替换原来的Editor为这个自定义的SafeEditor即可。
方案二:拦截长按事件手动处理
如果不想自定义控件,也可以给目标Editor设置长按监听器,拦截并处理长按逻辑,绕过系统的bug:
// 在Activity/Fragment的初始化代码里设置 yourEditorInstance.SetOnLongClickListener(new EditorLongClickListener()); // 自定义长按监听器 private class EditorLongClickListener : Java.Lang.Object, View.IOnLongClickListener { public bool OnLongClick(View v) { try { var editor = v as Editor; if (editor != null) { // 手动触发全选(根据你的需求调整,也可以什么都不做) editor.SetSelection(0, editor.Text?.Length ?? 0); } return true; // 消费长按事件,避免触发系统的有bug的逻辑 } catch (Java.Lang.NullPointerException ex) { if (ex.Message?.Contains("isDragAcceleratorActive") == true) { return true; } throw; } } }
方案三:升级Xamarin.Android版本
如果你的Xamarin.Android版本比较旧,可以尝试升级到最新的稳定版本——Xamarin团队会针对这类系统兼容性问题做修复,新版本可能已经内置了相关的规避逻辑。
补充说明
这个问题是三星S7在Android 7.0上的系统控件内部逻辑漏洞,我们无法从根源修复系统代码,只能通过上述方式规避崩溃,保证应用的稳定性。
内容的提问来源于stack exchange,提问作者XamDev
相关产品推荐
相关产品推荐

