我正在构建一个简单的自定义对话框,供用户使用两个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显示正确的值?
由于
答案 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()调用它。
我对所有的NumberPickers执行此操作,对我来说这似乎是一种可接受的解决方法。