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 都这样做,这对我来说似乎是一个可以接受的解决方法。
我正在构建一个简单的自定义对话框,供用户使用两个 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 都这样做,这对我来说似乎是一个可以接受的解决方法。