在我的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 的三星设备上。
答案 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的应用程序的默认主题)时,其中true
是Theme.DeviceDefault
mDecrementButton
为mIncrementButton
,则null
和mHasSelectorWheel
为true
,如果NumberPicker
由DEFAULT_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 mIncrementButton
和new ImageButton(numberPicker.getContext())
是否为空。如果使用反射,则将它们分别设置为Build
。
仅在受影响的设备之一上运行时应用此逻辑(检查<meta-data android:name="com.google.android.geo.API_KEY"
android:value="AIza*********************dNq4" />
常量)。
答案 2 :(得分:0)
查看所有4.3版本,很明显代码最有可能调用clearAccessibilityFocus()。
假设准确的行号我会在那里搜索可能的原因。没有什么可以跳出来,实际上大多数访问都有很好的空值检查。