Android 的 NumberPicker 在屏幕方向改变时显示错误的值

Android's NumberPicker displays wrong value when screen orientation changes

我正在构建一个简单的自定义对话框,供用户使用两个 NumberPickers 输入他们的当前体重,这两个 NumberPickers 代表体重的整数和小数部分。它们并排放置在 LinearLayout

     <LinearLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal"
    android:gravity="center_horizontal">

    <NumberPicker
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/newweight"
        android:layout_gravity="center_horizontal"
        android:background="@color/primary_dark"/>

    <NumberPicker
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/newweightdecimal"
        android:layout_gravity="center_horizontal"
        android:layout_marginLeft="1pt"
        android:background="@color/primary_dark"/>
</LinearLayout>

我注意到在屏幕方向改变并重新创建 activity 后,第一个 NumberPicker 总是显示第二个显示的数字。

奇怪的是,当以编程方式访问它的值时,它 returns 是正确的。此外,selecting + 或 - 在数字选择器上(在列表中向上或向下)使 NumberPicker 再次显示正确的值。

例如,如果在方向改变之前,第一个显示 70,第二个显示 1,之后都显示 1。但是它的 getValue returns 70。另外,如果我 select + 在第一个数字上选择器,它将其值更改为 71,正如您预期的那样,如果它首先显示 70。

这里是 Activity 的 onCreate 方法中两个 NumberPickers 的初始化。

    NumberPicker newweight = (NumberPicker) findViewById(R.id.newweight);
    newweight.setMinValue(0);
    newweight.setMaxValue(250);
    newweight.setValue((int)Math.round( Math.floor(weight) ));
     newweight.setDescendantFocusability(NumberPicker.FOCUS_BLOCK_DESCENDANTS);

    NumberPicker newweightdecimal = (NumberPicker) findViewById(R.id.newweightdecimal);
    newweightdecimal.setMinValue(0); 
    newweightdecimal.setMaxValue(9);
    newweightdecimal.setValue((int)Math.round( 10*(weight - Math.floor(weight))) );
    newweightdecimal.setDescendantFocusability(NumberPicker.FOCUS_BLOCK_DESCENDANTS);

有没有人知道为什么会发生这种情况以及如何确保 NumberPicker 显示正确的值?

谢谢

屏幕方向更改后 activity 将重新创建,因此请将您的数字选择器值存储在 onPause 方法中。 并在 onSaveInstance 中获取该值并再次设置为数字选择器。

在您的清单文件中使用这些代码(在您的 activity class 中),数据在移动设备的两种模式(横向或纵向)中都不会改变

android:configChanges="orientation|keyboard|keyboardHidden|screenSize|screenLayout|uiMode

或仅使用这些

android:configChanges="orientation|screenSize|screenLayout"

我知道这对你来说可能为时已晚,但它可能对其他人有所帮助。

NumberPicker 似乎包含正确的值,但显示错误的值。 (我使用的是 Theme.Black NumberPicker 样式)

我还没有找到 refresh/repaint/redraw 的方法,所以我将该值设置为 0,然后在 onRestoreInstanceState() 中再次将其设置为我想要的值(在 onCreate( 中对我不起作用), 这是一个额外的初始化).

将以下内容添加到 onRestoreInstanceState(Bundle):

NumberPicker newweight = (NumberPicker) findViewById(R.id.newweight);
newweight.setValue(0);
newweight.setValue((int)Math.round( Math.floor(weight) ));

NumberPicker newweightdecimal = (NumberPicker) findViewById(R.id.newweightdecimal);
newweightdecimal.setValue(0);
newweightdecimal.setValue((int)Math.round( 10*(weight - Math.floor(weight))) );

为避免重复,您可以将它放在一个函数中并从 onCreate 和 onRestoreInstanceState() 调用它。

我对所有 NumberPickers 都这样做,这对我来说似乎是一个可以接受的解决方法。