ChangeCurrentByOneFromLongPressCommand 中的 NPE(在三星设备上使用 Android 4.3)

2022-08-31 19:59:37

在我的Android应用程序视图中使用几个,当我按住其中一个数字箭头时,我会收到以下消息:-android.widget.NumberPicker

FATAL EXCEPTION: main 
java.lang.NullPointerException at android.widget.NumberPicker$ChangeCurrentByOneFromLongPressCommand.run(NumberPicker.java:2245)
at android.os.Handler.handleCallback(Handler.java:730)
at android.os.Handler.dispatchMessage(Handler.java:92)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:5419)

有人对我如何阻止这个问题有任何想法吗?

更新:从到目前为止的评论来看,似乎此异常仅发生在带有Android 4.3的三星设备上


答案 1

因此,三星与AOSP略有不同。类的代码有一些额外的逻辑,包括NumberPickerChangeCurrentByOneFromLongPressCommand

if (!mIsDeviceDefault) {
    // ...
} else if (mDecrementButton.isShown() || mIncrementButton.isShown()) {
    // ...
  • 当您使用其中一个主题(这是启动Android 4.x的应用程序的默认主题)时,wheremIsDeviceDefaulttrueTheme.DeviceDefault
  • where 和 are if 是 ,如果由其样式指定的布局资源 ID 是mDecrementButtonmIncrementButtonnullmHasSelectorWheeltrueNumberPicker
    • DEFAULT_LAYOUT_RESOURCE_ID / @layout/number_picker
    • TOUCHWIZ_DARK_LAYOUT_RESOURCE_ID / @layout/tw_number_picker_dark
    • TOUCHWIZ_LIGHT_LAYOUT_RESOURCE_ID / @layout/tw_number_picker_light

这表明这种情况会一直发生。

以下是所有可能的样式:

<style name="Widget.NumberPicker">
    <item name="orientation">1</item>
    <item name="fadingEdge">2000</item>
    <item name="fadingEdgeLength">50dp</item>
    <item name="internalLayout">@layout/number_picker</item>
</style>

<style name="Widget.Holo.NumberPicker">
    <item name="solidColor">@color/transparent</item>
    <item name="internalLayout">@layout/number_picker_with_selector_wheel</item>
    <item name="selectionDivider">@drawable/numberpicker_selection_divider</item>
    <item name="selectionDividerHeight">2dp</item>
    <item name="selectionDividersDistance">48dp</item>
    <item name="internalMaxHeight">180dp</item>
    <item name="internalMinWidth">64dp</item>
    <item name="virtualButtonPressedDrawable">?attr/selectableItemBackground</item>
</style>

<style name="Widget.DeviceDefault.NumberPicker">
    <item name="internalLayout">@layout/tw_number_picker_dark</item>
</style>

<style name="Widget.DeviceDefault.Light.NumberPicker">
    <item name="internalLayout">@layout/tw_number_picker_light</item>
</style>

来源:下载三星Galaxy S3的Android 4.3固件,使用ext4解包器提取框架文件,反编译并使用Universal Deodexer V5,探索了包括使用JADX在内的结果。framework.jarframework2.jarframework-res.apk

如何修复

构造后,使用反射来检查 和 是否为空。如果它们使用反射将它们分别设置为 .NumberPickerImageButton mDecrementButtonImageButton mIncrementButtonnew ImageButton(numberPicker.getContext())

仅当在其中一个受影响的设备上运行时才应用此逻辑(检查常量)。Build


答案 2

http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/4.3_r1/android/view/View.java#View.clearAccessibilityFocus%28%29

查看所有4.3版本,很明显代码最有可能调用clearAccessibilityFocus()。

假设行号准确,我会在那里搜索可能的原因。没有什么能跳出来,事实上,大多数访问都有良好的空检查。


推荐