当屏幕方向改变时,Android的NumberPicker会显示错误的值

时间:2015-04-23 12:09:04

标签: android numberpicker

我正在构建一个简单的自定义对话框,供用户使用两个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>

我注意到在屏幕方向更改并重新创建活动后,第一个NumberPicker始终显示第二个显示的数字。

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

例如,如果在方向更改之前,第一个显示70,第二个显示1,之后两个显示1.但是它的getValue返回70.如果我在第一个数字选择器上选择+,它将其值更改为71,如如果它首先显示70,你会期望。

以下是Activity&#39s 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显示正确的值?

由于

3 个答案:

答案 0 :(得分:0)

一旦屏幕方向改变,则重新创建活动,因此将您的数字选择器值存储在onPause方法中。 并在onSaveInstance中获取该值并再次设置为数字选择器。

答案 1 :(得分:0)

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

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

或者简单地使用这些

android:configChanges="orientation|screenSize|screenLayout"

答案 2 :(得分:0)

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

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

我还没有找到刷新/重绘/重绘的方法,所以我将值设置为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()调用它。

我对所有的Nu​​mberPickers执行此操作,对我来说这似乎是一种可接受的解决方法。