带有Nougat的java.lang.NullPointerException

时间:2017-03-21 11:59:55

标签: nullpointerexception samsung-mobile android-7.0-nougat

我的应用程序一直在通过各种Android版本很好地哼唱。我有用户在Android 4.3,5.0,5.1和6.0上运行它没有任何问题。但是,使用S7 Edge的用户刚刚使用Android 7.0进行了更新,当文本粘贴到EditText字段时应用程序崩溃(这是您使用此应用程序的第一个也是唯一的事情 - 它开始您将文本粘贴到一个框中然后应用程序解析文本)。

我已经查看了Null Pointer Exceptions上的许多线程,我查看了Editor.java的源代码,但没有什么是显而易见的。下面的堆栈跟踪显示我的代码没有问题。他们用7.0改变了什么可能导致这种情况?

java.lang.NullPointerException: Attempt to invoke virtual method 'boolean android.widget.Editor$SelectionModifierCursorController.isDragAcceleratorActive()' on a null object reference
at android.widget.Editor.updateFloatingToolbarVisibility(Editor.java:1520)
at android.widget.Editor.onTouchEvent(Editor.java:1475)
at android.widget.TextView.onTouchEvent(TextView.java:10024)
at android.view.View.dispatchTouchEvent(View.java:10725)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2865)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2550)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2865)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2550)
at android.widget.ScrollView.dispatchTouchEvent(ScrollView.java:738)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2865)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2550)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2865)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2550)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2865)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2550)
at com.android.internal.policy.DecorView.superDispatchTouchEvent(DecorView.java:505)
at com.android.internal.policy.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1863)
at android.app.Activity.dispatchTouchEvent(Activity.java:3226)
at com.android.internal.policy.DecorView.dispatchTouchEvent(DecorView.java:467)
at android.view.View.dispatchPointerEvent(View.java:10954)
at android.view.ViewRootImpl$ViewPostImeInputStage.processPointerEvent(ViewRootImpl.java:5051)
at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:4908)
at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:4439)
at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:4492)
at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:4458)
at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:4591)
at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:4466)
at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:4648)
at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:4439)
at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:4492)
at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:4458)
at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:4466)
at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:4439)
at android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:6936)
at android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:6875)
at android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:6836)
at android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent(ViewRootImpl.java:7046)
at android.view.InputEventReceiver.dispatchInputEvent(InputEventReceiver.java:185)
at android.view.InputEventReceiver.nativeConsumeBatchedInputEvents(Native Method)
at android.view.InputEventReceiver.consumeBatchedInputEvents(InputEventReceiver.java:176)
at android.view.ViewRootImpl.doConsumeBatchedInput(ViewRootImpl.java:7010)
at android.view.ViewRootImpl$ConsumeBatchedInputRunnable.run(ViewRootImpl.java:7073)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:927)
at android.view.Choreographer.doCallbacks(Choreographer.java:702)
at android.view.Choreographer.doFrame(Choreographer.java:632)
at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:913)
at android.os.Handler.handleCallback(Handler.java:751)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:6688)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1468)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1358)

3 个答案:

答案 0 :(得分:5)

我通过删除

解决了这个问题

MyEditText.setMovementMethod(new ScrollingMovementMethod());

答案 1 :(得分:4)

这是阻止复制粘贴菜单以任何方式,形状或形式出现的方式。这个错误真的让我发疯,就像任何三星的bug一样,你知道它的代码,但你也知道他们很快就会解决它。无论如何,这里有奇妙的墙......

  1. 检查Android.Build.Model.toLowerCase()。startsWith(' sm-g930')。不匹配整个字符串,最后一个字母是次要版本标识符。我将这个布尔值存储在了稍后出现的shouldBlockCopyPaste变量中。

  2. 如果匹配,则要阻止复制粘贴菜单显示。这就是你的实际行动方式!!!

  3. 覆盖这两个函数,你会注意到我的shouldBlockCopyPaste布尔值,这是其他设备不被阻止的。

       @Override
       public ActionMode StartActionMode (ActionMode.Callback callback){
          if (shouldBlockCopyPaste) {
            return null;
          } else {
            return super.StartActionMode(callback);
          }
        }
    
       @Override
       public ActionMode StartActionMode (ActionMode.Callback callback, int type){
          if (shouldBlockCopyPaste) {
            return null;
          } else {
            return super.StartActionMode(callback, type);
          }
        }
    

答案 2 :(得分:0)

我在三星设备的应用程序中看到了这段时间的崩溃。结果发现,长按TextView会在这些设备上显示复制粘贴菜单,用户甚至可以粘贴文本(尽管它不是EditText组件)。结束了在罪魁祸首TextViews(最重要的是longClickable)的XML中禁用所有类型的交互,并且崩溃不会消失。

 <TextView
...
    android:longClickable="false"
    android:clickable="false"
    android:linksClickable="false" />