NullPointerException: int android.widget.Editor$SelectionModifierCursorController.getMinTouchOffset()
Это очень странное исключение ОС устройства Xiaomi. Даже если у меня есть журналы, доступные из Fabric, трассировка стека не ссылается ни на один мой код.
Подробности о сбое приведены ниже, как сообщается в crashalytics (Fabric),
21K падает
Все вылеты на устройствах Xiaomi
Сбои в ОС Android версии 6, 7 и 8
Crash Log:
# OS Version: 8.1.0
# Device: Redmi Note 5 pro
# RAM Free: 30.1%
# Disk Free: 74.2%
#0. Crashed: main
at android.widget.Editor.touchPositionIsInSelection(Editor.java:1084)
at android.widget.Editor.performLongClick(Editor.java:1205)
at android.widget.TextView.performLongClick(TextView.java:10908)
at android.view.View.performLongClick(View.java:6360)
at android.view.View$CheckForLongPress.run(View.java:24768)
at android.os.Handler.handleCallback(Handler.java:790)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:171)
at android.app.ActivityThread.main(ActivityThread.java:6606)
at java.lang.reflect.Method.invoke(Method.java)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:518)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:823)
--
Fatal Exception: java.lang.NullPointerException: Attempt to invoke virtual method 'int android.widget.Editor$SelectionModifierCursorController.getMinTouchOffset()' on a null object reference
at android.widget.Editor.touchPositionIsInSelection(Editor.java:1084)
at android.widget.Editor.performLongClick(Editor.java:1205)
at android.widget.TextView.performLongClick(TextView.java:10908)
at android.view.View.performLongClick(View.java:6360)
at android.view.View$CheckForLongPress.run(View.java:24768)
at android.os.Handler.handleCallback(Handler.java:790)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:171)
at android.app.ActivityThread.main(ActivityThread.java:6606)
at java.lang.reflect.Method.invoke(Method.java)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:518)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:823)
#0. Crashed: main
at android.widget.Editor.touchPositionIsInSelection(Editor.java:1084)
at android.widget.Editor.performLongClick(Editor.java:1205)
at android.widget.TextView.performLongClick(TextView.java:10908)
at android.view.View.performLongClick(View.java:6360)
at android.view.View$CheckForLongPress.run(View.java:24768)
at android.os.Handler.handleCallback(Handler.java:790)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:171)
at android.app.ActivityThread.main(ActivityThread.java:6606)
at java.lang.reflect.Method.invoke(Method.java)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:518)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:823)
Похожие ссылки:
https://issuetracker.google.com/issues/37127697
java.lang.NullPointerException с нугой
Также спросили на официальном форуме Xiaomi http://en.miui.com/forum.php?mod=viewthread&tid=4595164
Пожалуйста, предоставьте любое рабочее решение как можно скорее. Поскольку пользователи не должны быть довольны этими сбоями.
Заранее спасибо.
1 ответ
1) Â Прежде всего, только при необходимости Â установите одно из этих значений.
textView.setMovementMethod(LinkMovementMethod.getInstance());
или
setAutoLinkMask(Linkify.ALL);
или
Linkify.addLinks(textView, Linkify.PHONE_NUMBERS | Linkify.EMAIL_ADDRESSES | Linkify.MAP_ADDRESSES);
2) Во-вторых, установите для TextView прослушиватель длинных щелчков, и он должен возвращать истину.
textView.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
// do soemthing if needed
return true;
}
});
На устройствах Xiaomi есть внутренняя ошибка. Если вы сначала переопределите setOnLongClickListener( ссылка), а затем выполните первый шаг, он будет использовать внутреннюю реализацию, и это будет продолжать сбой. Таким образом, важно последовательно выполнить вышеуказанные шаги.
Я открыт для других решений, однако, следуя этому подходу, я больше не вижу отчетов о сбоях.
У вас есть обычай TextView
в вашем приложении? Возможно ли изменить размер или имеет дополнительную функциональность?
Скин Android от Xiaomi, вероятно, мешает этому и вызывает сбои. Я предлагаю пытаться долго нажимать все TextView
в вашем приложении.
Это происходит, когда пользователь делает долгий щелчок по всему выделенному тексту. Просто определите longClickListener:
edit_text.setOnLongClickListener {
doSomething()
true
}
а позже вы можете удалить это
edit_text.setOnLongClickListener(null)
Для меня эта авария произошла, когда TextView
содержала ссылку и setAutoLinkMask(Linkify.ALL);
был вызван для просмотра. В этом случае Android обрабатывает все щелчки (в том числе длинные) в этом представлении. На устройствах других брендов ссылка открывалась после долгого нажатия, но на устройстве Xiaomi произошел сбой. Похоже, у них немного другая логика обработкиonTouchEvent
внутри TextView
. Я немного поигрался и обнаружил, что настройкаandroid:textIsSelectable="false"
для TextView
в файле макета решает проблему.
Я знаю, что это не масштабируемое решение, но для моего случая оно было идеальным, поэтому я прекратил дальнейшие исследования. Может, подскажет кому-нибудь.