繁体   English   中英

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

[英]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 开始的应用程序的默认主题)时, mIsDeviceDefaulttrue
  • 其中mDecrementButtonmIncrementButtonnull ,如果mHasSelectorWheeltrue ,如果布局资源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.jarframework2.jar使用通用Deodexer V5,探索的结果,包括framework-res.apk使用JADX。

如何修复

你的后NumberPicker构造使用反射来检查ImageButton mDecrementButtonImageButton 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" />

我希望它有帮助。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM