53

在我的 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 的三星设备上

4

3 回答 3

1

所以三星NumberPicker与AOSP略有不同。类的代码ChangeCurrentByOneFromLongPressCommand有一些额外的逻辑,包括

if (!mIsDeviceDefault) {
    // ...
} else if (mDecrementButton.isShown() || mIncrementButton.isShown()) {
    // ...
  • 当您使用其中一个主题mIsDeviceDefault时在哪里(这是启动 Android 4.x 的应用程序的默认主题)trueTheme.DeviceDefault
  • wheremDecrementButtonmIncrementButtonare nullif mHasSelectorWheelis true,如果NumberPicker由其样式指定的布局资源 ID 是其中之一, 则会发生这种情况
    • 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 unpacker 提取框架文件,反编译framework.jarframework2.jar使用Universal Deodexer V5,探索结果包括framework-res.apk使用JADX

怎么修

构建后NumberPicker使用反射检查是否ImageButton mDecrementButtonImageButton mIncrementButton空。如果它们使用反射将它们每个设置为new ImageButton(numberPicker.getContext()).

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

于 2020-06-23T07:25:54.517 回答
0

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()。

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

于 2014-04-24T14:57:58.963 回答
0

这就是我在我的应用程序中实现 NumberPicker 的方式,它对我来说效果很好:

java 代码,在您的 onCreate() 中:

NumberPicker numberpicker = (NumberPicker) findViewById(R.id.np_from);
numberpicker.setMaxValue(100);
numberpicker.setMinValue(16);

XML 代码

           <NumberPicker
            android:id="@+id/np_from"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_margin="20dp"
            android:width="100dip" />

我希望它有所帮助。

于 2014-04-13T07:47:43.480 回答