ChangeCurrentByOneFrom中的NPE长按命令(在带有/ Android 4.3的三星设备上)

时间:2013-12-30 09:44:14

标签: java android numberpicker

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

3 个答案:

答案 0 :(得分:1)

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

你的onCreate()中的

java代码

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" />

我希望它有所帮助。

答案 1 :(得分:1)

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

if (!mIsDeviceDefault) {
    // ...
} else if (mDecrementButton.isShown() || mIncrementButton.isShown()) {
    // ...
  • 当您使用mIsDeviceDefault主题之一(这是启动Android 4.x的应用程序的默认主题)时,其中trueTheme.DeviceDefault
  • 如果mDecrementButtonmIncrementButton,则nullmHasSelectorWheeltrue,如果NumberPickerDEFAULT_LAYOUT_RESOURCE_ID指定的布局资源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>

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

以下是所有可能的样式:

framework.jar

资料来源:已下载适用于Samsung Galaxy S3的Android 4.3固件,使用 ext4解压缩器提取了框架文件,并使用 Universal Deodexer V5 framework2.jar和framework-res.apk >,使用 JADX 探索了包括NumberPicker在内的结果。

如何修复

构造好ImageButton mDecrementButton后,使用反射检查ImageButton mIncrementButtonnew ImageButton(numberPicker.getContext())是否为空。如果使用反射,则将它们分别设置为Build

仅在受影响的设备之一上运行时应用此逻辑(检查<meta-data android:name="com.google.android.geo.API_KEY" android:value="AIza*********************dNq4" /> 常量)。

答案 2 :(得分: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()。

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