[英]Android Spinner not working on Samsung Devices with Android 5.0
[英]NPE in ChangeCurrentByOneFromLongPressCommand (on Samsung devices w/ Android 4.3)
在我的 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 的三星设备上。
所以三星NumberPicker
和 AOSP 略有不同。 ChangeCurrentByOneFromLongPressCommand
类的代码有一些额外的逻辑,包括
if (!mIsDeviceDefault) {
// ...
} else if (mDecrementButton.isShown() || mIncrementButton.isShown()) {
// ...
Theme.DeviceDefault
主题之一(这是从 Android 4.x 开始的应用程序的默认主题)时, mIsDeviceDefault
为true
mDecrementButton
和mIncrementButton
是null
,如果mHasSelectorWheel
是true
,如果布局资源ID恰好NumberPicker
指定其风格是一个
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>
来源:下载的Android 4.3固件三星Galaxy S3,利用ext4的解包,反编译提取的框架文件framework.jar
和framework2.jar
使用通用Deodexer V5,探索的结果,包括framework-res.apk
使用JADX。
你的后NumberPicker
构造使用反射来检查ImageButton mDecrementButton
和ImageButton mIncrementButton
为空。 如果他们使用反射将它们每个设置为一个new ImageButton(numberPicker.getContext())
。
仅在受影响的设备之一上运行时应用此逻辑(检查Build
常量)。
这就是我在我的应用程序中实现 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" />
我希望它有帮助。
查看所有 4.3 版本,很明显代码很可能调用 clearAccessibilityFocus()。
假设行号准确,我会在那里搜索可能的原因。 没有什么让我感到惊讶,事实上大多数访问都有很好的空检查。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.