est-il possible de le faire de manière plus pratique que de la manipuler dans l'événement Onscrolllistener? Dommage qu'il n'a pas d'attribut de taille de pas ... p>
6 Réponses :
Pourquoi ne pas simplement ajouter un Onvaluechangelistener Quelque chose comme: < Pré> xxx pré> p>
OK, mais c'est comme utiliser l'Onscrolllistener. Utilise des événements le seul moyen d'accomplir cet effet?
Oui, je suppose que vous pourriez étendre la classe à avoir une taille de pas, puis remplacer la méthode OnClick. C'est probablement plus de code que d'utiliser l'auditeur cependant.
La méthode de l'auditeur doit être ONVALUCHANGANGE au lieu d'ONCHANGE et le Setter doit maintenant être SETONVALUCHANGEDLISNER.
Le numérypicker in Android a une méthode appelée SetDisPlayedvalues . Vous pouvez utiliser celui-ci pour afficher des valeurs personnalisées (il prend une gamme de chaînes) puis de les cartographier lorsque vous avez besoin de la valeur. Donc, si vous avez besoin d'étapes de 5 dans un sélecteur minute, par exemple, vous pouvez créer un tableau comme celui-ci:
Integer.parseInt(minuteValues[newVal]);
Notez que Android affiche les valeurs personnalisées en ordre croissant de haut en bas. Vous voudrez peut-être l'inverser en remplaçant i * 5 code> avec
55-i * 5 code>
Le numérypicker in Android a une méthode appelée SetDisplayedvalues . Vous pouvez utiliser celui-ci pour afficher des valeurs personnalisées (il prend une gamme de chaînes) puis de les cartographier lorsque vous avez besoin de la valeur. p>
Par exemple, vous pouvez créer une fonction comme ceci: p>
xxx pré> donc, vous devez appeler la méthode> NumberPicker.setdisplayedvalues , par exemple: P>
String sValue = String.valueOf(10+(myNumberPick.getValue()*5)); //->> (iMinValue + (myNumberPick.getValue()*iStep))
mynumberpick.setmaxvalue ((max-pas) / min + 1); // comme istepsarray dans la fonction c'est mieux si c'est le cas: (max-min) / étape. - Min pourrait être 0 et diviser par 0 c'est faux. - Sans +1 parce que vous allez ajouter 1 valeur plus
Pour définir un pas de pas de '5' par exemple, utilisez le NumberPicker.formatter A>: NumberPicker.Formatter formatter = new NumberPicker.Formatter() {
@Override
public String format(int value) {
int temp = value * 5;
return "" + temp;
}
};
numberPicker.setFormatter(formatter);
En fait, cette solution est simple mais difficile en même temps, je préfère préférer ainsi
N'oubliez pas de régler toujours le numérypicker.setmaxvalue sur quelque chose de raisonnable. Si vous ne le réglez pas à tout le sélecteur, vous ne montrerez que 0. Pendant une heure d'incréments de 5 minutes, par exemple, vous devez le définir sur 11, car le sélecteur va contenir 11 chiffres (0 à 55).
Il pourrait également être une bonne idée de définir numériquesPicker.setDescendantFocusability (Viewgroup.focus_Block _deCendants); Sinon, le champ Numéro du cueilleur sera capable de se concentrer sur les intrants.
@CKN puis le numéro initial n'est tout simplement pas affiché avant le défilement! Il n'est généralement pas affiché mais apporterait le clavier pour l'entrée. Une solution pour cela?
Lorsque vous utilisez des méthodes décrites ci-dessus, il convient de constabiliser que le sélecteur permet à l'utilisateur de sélectionner non seulement une valeur en défilant, mais également en l'entrant avec le clavier.
Par défaut, le type d'entrée du champ de saisie est Définissez sur Par conséquent, l'utilisation de formateurs dans ce cas peut entraîner un comportement inattendu. Disons que vous souhaitiez que l'utilisateur puisse choisir uniquement les valeurs "0" ou "5". Vous pouvez avoir du code comme celui-ci: p> Toutefois, dans ce scénario, l'utilisateur est présenté avec le clavier numérique, mais est capable uniquement d'entrer uniquement "0" ou "1" . P> Si vous utilisez à la place: P> type_class_number code>, et donc l'utilisateur est présenté avec le clavier numérique. Il semble que lorsque vous utilisez
setingisplayedvalues code> Le sélecteur modifie le type à
Type_class_text code>, si vous utilisez
Setformatter code> Le type d'entrée n'est pas modifié.
try {
Field inputField = NumberPicker.class.getDeclaredField("mInputText");
inputField.setAccessible(true);
EditText inputText = (EditText) inputField.get(numberPicker);
inputText.setRawInputType(InputType.TYPE_CLASS_NUMBER);
} catch (ClassCastException e) {
// Just ignore this exception and do nothing.
} catch (IllegalAccessException e) {
// Just ignore this exception and do nothing.
} catch (NoSuchFieldException e) {
// Just ignore this exception and do nothing.
}
C'est une meilleure approche pour la solution AJPOLT
avec toute taille de pas prédéfinie, il prend en charge la valeur personnalisée définie via le clavier. P>
final NumberPicker np = (NumberPicker) dialogView.findViewById(R.id.numberPicker1); np.setMaxValue(1000); // max value 1000 np.setMinValue(0); // min value 0 np.setValue(defValue); np.setWrapSelectorWheel(false); final int m_oldFocus = np.getDescendantFocusability(); np.setDescendantFocusability(NumberPicker.FOCUS_BLOCK_DESCENDANTS); np.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View view, MotionEvent motionEvent) { np.setDescendantFocusability(m_oldFocus); return false; } }); np.setOnValueChangedListener(new NumberPicker.OnValueChangeListener() { @Override public void onValueChange(NumberPicker numberPicker, int oldVal, int newVal) { int stepSize = 10; if(newVal%stepSize !=0){ if(newVal < oldVal){ numberPicker.setValue(((int)(newVal/stepSize)) *stepSize); }else{ numberPicker.setValue((((int)(newVal/stepSize)) *stepSize ) +stepSize ); } }else{ numberPicker.setValue(newVal); } } });