2017-02-23 5 views
0

Ich möchte einen NumberPicker mit einem Array von angezeigten Werten erstellen. Die Werte sollten sich nicht ändern, wenn der NumberPicker angezeigt wird, aber die Min- und Max-Werte ändern sich je nach Benutzeraktion dynamisch. HiersetMinValue on NumberPicker wählt nicht den richtigen min Wert

ist der Code:

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 

    <NumberPicker 
     android:id="@+id/picker" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_centerInParent="true"/> 
</RelativeLayout> 

In Hauptaktivität

public class MainActivity extends AppCompatActivity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     final String[] values = new String[]{"0", "1", "2", "3", "4", "5", "6", "7", "8", "9"}; 

     NumberPicker picker = (NumberPicker) findViewById(R.id.picker); 
     picker.setDisplayedValues(values); 
     picker.setMaxValue(7); 
     picker.setMinValue(3); 

     picker.setWrapSelectorWheel(false); 
    } 
} 

Wenn ich das Maximum eingestellt, ohne die minimale Einstellung, ich mit angezeigten Werten zwischen "0" zu beenden und "7" (inbegriffen). Wenn ich den minValue auf 0 setze, habe ich das gleiche Verhalten. Aber wenn ich den minValue auf 3 setze, beende ich mit angezeigten Werten zwischen "0" und "4". Wenn es zwischen "3" und "7" sein soll.

Ich verstehe nicht warum. Habe ich etwas falsch gemacht oder gibt es ein Problem mit der Komponente?

Antwort

2

Wenn Sie bei der Umsetzung von setMinValue aussehen oder setMaxValue gibt es einen Kommentar, der sagt:

* <strong>Note:</strong> The length of the displayed values array 
* set via {@link #setDisplayedValues(String[])} must be equal to the 
* range of selectable numbers which is equal to 
* {@link #getMaxValue()} - {@link #getMinValue()} + 1. 

Also, dies zu umgehen ist es am besten, nur die Werteliste setzen, wenn Sie möchten, Aktualisiere die angezeigten Werte.

//do this once in onCreate and save the values list somewhere where you have access 
final List<String> values = new ArrayList<>(); 
for (int i = 0; i < 10; ++i) { 
    values.add(String.valueOf(i)); 
} 
NumberPicker picker = (NumberPicker) findViewById(R.id.picker); 
picker.setWrapSelectorWheel(false); 


//do this every time you want to change the displayed values and set minValue and maxValue accordingly 
//also make sure that you stay within the bounds of value 
int minValue = 3; 
int maxValue = 7; 

final List<String> subValues = values.subList(minValue, maxValue + 1); 
String[] subValuesArray = new String[subValues.size()]; 
subValuesArray = subValues.toArray(subValuesArray); 
picker.setDisplayedValues(subValuesArray); 
picker.setMinValue(0); 
picker.setMaxValue(subValues.size() - 1); 
+0

Könnten Sie bitte näher darauf eingehen? Warum behebt es das Problem des OP nicht? Haben Sie nicht auch vorgeschlagen, den Anzeigewert zu ändern, wenn sich der Min/Max-Wert ändert (vielleicht habe ich das falsch verstanden)? – Bmuig

+0

Ich entschuldige mich, ich habe Ihren Vorschlag falsch gelesen. Es funktioniert wie erwartet. Das tut mir leid! –

1

Es ist erklärbar von the documentation. Wenn Sie min und max einstellen, definieren Sie int-Werte, die mit NumberPicker eingegeben werden können. So akzeptiert setValue(int) nur Werte von min bis max.

Die displayValues() ist Etiketten überschreiben. Und es wird in einer nächsten Art und Weise verwendet werden - NumberPicker wird Etikett mit Index value - min nehmen.

+0

Also, es bedeutet, muss ich jedes Mal, wenn ich die min und max die Anordnung der angezeigten Werte ändern ändern? – Eselfar

+0

Leider müssen Sie ja –

0

der Kürze halber @Bmuig Antwort, nur eine Hilfsfunktion:

private void configurePicker(NumberPicker picker, ArrayList<String> values, int minValue, int maxValue, int currentValue) { 
    picker.setDisplayedValues(values) //to avoid out of bounds 
    picker.setMinValue(minValue); 
    picker.setMaxValue(maxValue); 
    picker.setValue(currentValue); 
    picker.setDisplayedValues((String[]) values.subList(minValue, maxValue + 1).toArray()); 
} 
Verwandte Themen