Est-il possible de le faire dans un moyen plus pratique que de le manipuler dans le OnScrollListener événement? Dommage qu'il ne dispose pas d'une étape attribut de taille...
Ok, mais c'est tout comme l'utilisation de la onScrollListener. Est d'utiliser les événements de la seule façon de réaliser cet effet?
Oui, je suppose qu'on pourrait étendre la classe d'avoir une taille de pas, puis remplacer la méthode onClick. C'est sans doute que le code juste en utilisant l'auditeur bien.
L'auditeur de la méthode doit être onValueChange au lieu de onChange et le mutateur doit être setOnValueChangedListener maintenant.
La NumberPicker dans Android a une méthode appelée setDisplayedValues.
Vous pouvez l'utiliser pour afficher des valeurs personnalisées (il prend un tableau de Chaînes de caractères) et puis la carte lorsque vous aurez besoin de la valeur.
Donc, si vous avez besoin d'étapes de 5 minutes de sélecteur, par exemple, vous pouvez créer un tableau comme ceci:
String[] minuteValues =newString[12];for(int i =0; i < minuteValues.length; i++){String number =Integer.toString(i*5);
minuteValues[i]= number.length()<2?"0"+ number : number;}
minutePicker.setDisplayedValues(minuteValues);
Et puis, quand vous obtenez la valeur de la OnValueChangeListener, vous avez juste besoin de jeter en arrière pour un entier:
en fait, cette solution est simple, mais difficile en même temps, je préfère cette façon
N'oubliez pas de toujours définir les numberPicker.setMaxValue à quelque chose de raisonnable. Si vous n'avez pas à tout le sélecteur de ne montrer 0. Pour une heure dans des incréments de 5 minutes par exemple, vous pouvez définir à 11, depuis le sélecteur va contenir 11 chiffres (0 - 55).
Il pourrait également être une bonne idée de mettre en numberPicker.setDescendantFocusability(ViewGroup.FOCUS_BLOCK_DESCENDANTS); Autrement, le nombre de champ dans le sélecteur sera en mesure de devenir porté pour l'entrée.
Ensuite, le nombre initial n'est tout simplement pas affichés jusqu'à ce défilé! Elle n'est généralement pas affiché, mais apporter du clavier pour la saisie. Toute solution pour cela?
La NumberPicker dans Android a une méthode appelée setDisplayedValues. Vous pouvez l'utiliser pour afficher des valeurs personnalisées (il prend un tableau de Chaînes de caractères) et puis la carte lorsque vous aurez besoin de la valeur.
Par exemple, vous pouvez créer une fonction comme ceci:
publicString[] getArrayWithSteps (int iMinValue,int iMaxValue,int iStep){int iStepsArray =(iMaxValue-iMinValue)/ iStep+1;//get the lenght array that will returnString[] arrayValues=newString[iStepsArray];//Create array with length of iStepsArray for(int i =0; i < iStepsArray; i++){
arrayValues[i]=String.valueOf(iMinValue +(i * iStep));}return arrayValues;}
int min =5;int max =180;int step =10;String[] myValues = getArrayWithSteps(min, max, step);//get the values with steps... Normally //Setting the NumberPick (myNumberPick)
myNumberPick.setMinValue(0);
myNumberPick.setMaxValue((max-step)/ min +1);//Like iStepsArray in the function//Because the Min and Max Value should be the range that will show. //For example, Min = 0 and Max = 2, so the NumberPick will display the first three strings in the array String (myValues);
myNumberPick.setDisplayedValues(myValues);//put on NumberPicker
myNumberPick.setMaxValue((max-étape)/min+1); //Comme iStepsArray dans la fonction C'est mieux si c'est : (max-min)/étape. Min peut être de 0 et de diviser par 0, c'est faux. - sans +1 parce que vous allez ajouter de la valeur 1 plus
Lors de l'utilisation de méthodes décrites ci-dessus, on doit être conscient que le sélecteur permet à l'utilisateur non seulement de sélectionner une valeur par défilement, mais aussi par l'entrée avec le clavier.
Par défaut, le type d'entrée du champ d'entrée est fixé à TYPE_CLASS_NUMBER, et, par conséquent, l'utilisateur est présenté avec clavier numérique. Il semble que lorsque vous utilisez setDisplayedValues le sélecteur de change le type de TYPE_CLASS_TEXT, cependant, lorsque vous utilisez setFormatter le type d'entrée n'est pas modifié.
Donc à l'aide de formateur dans ce cas peut entraîner un comportement inattendu. Disons que vous voulez que l'utilisateur soit en mesure de prendre que les valeurs "0" ou "5". Vous pouvez avoir un code comme ceci:
NumberPicker numberPicker =(NumberPicker) findViewById(R.id.my_number_picker);
numberPicker.setMinValue(0);
numberPicker.setMaxValue(1);
numberPicker.setFormatter(v -> v ==0?"0":"5");
Toutefois, dans ce scénario, l'utilisateur est présenté avec le clavier numérique, mais est seulement pu entrer que des "0" ou "1".
l'utilisateur d'afficher le texte au clavier, mais sera en mesure d'entrer "0" ou "5" comme prévu.
Si vous êtes dérangé par le texte de clavier que vous pouvez utiliser la réflexion pour accéder à la zone privée et réglez l'entrée type de numéro (qui n'est bien sûr pas recommandé, sauf si vraiment nécessaire). Le champ est appelé "mInputText", ou "mText", si vous ciblez les oldies goldies comme le pain d'épices.
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.}
Pourquoi ne pas simplement ajouter un OnValueChangeListener quelque Chose comme:
La NumberPicker dans Android a une méthode appelée setDisplayedValues.
Vous pouvez l'utiliser pour afficher des valeurs personnalisées (il prend un tableau de Chaînes de caractères) et puis la carte lorsque vous aurez besoin de la valeur.
Donc, si vous avez besoin d'étapes de 5 minutes de sélecteur, par exemple, vous pouvez créer un tableau comme ceci:
Et puis, quand vous obtenez la valeur de la
OnValueChangeListener
, vous avez juste besoin de jeter en arrière pour un entier:Pour définir un nombre de pas de "5", par exemple, utiliser le NumberPicker.Formateur:
Par exemple, vous pouvez créer une fonction comme ceci:
Donc, vous devez appeler la méthode> NumberPicker.setDisplayedValues, par exemple:
Pour obtenir la Valeur dans le NumberPick:
C'est la meilleure approche pour ajpolt solution
avec prédéfinie, l'étape de la taille, il personnalisés valeur définie via le clavier.
*Je sais que c'est 5 ans Question, mais peut être utile pour quelqu'un
Lors de l'utilisation de méthodes décrites ci-dessus, on doit être conscient que le sélecteur permet à l'utilisateur non seulement de sélectionner une valeur par défilement, mais aussi par l'entrée avec le clavier.
Par défaut, le type d'entrée du champ d'entrée est fixé à
TYPE_CLASS_NUMBER
, et, par conséquent, l'utilisateur est présenté avec clavier numérique. Il semble que lorsque vous utilisezsetDisplayedValues
le sélecteur de change le type deTYPE_CLASS_TEXT
, cependant, lorsque vous utilisezsetFormatter
le type d'entrée n'est pas modifié.Donc à l'aide de formateur dans ce cas peut entraîner un comportement inattendu. Disons que vous voulez que l'utilisateur soit en mesure de prendre que les valeurs "0" ou "5". Vous pouvez avoir un code comme ceci:
Toutefois, dans ce scénario, l'utilisateur est présenté avec le clavier numérique, mais est seulement pu entrer que des "0" ou "1".
Si vous utilisez à la place:
l'utilisateur d'afficher le texte au clavier, mais sera en mesure d'entrer "0" ou "5" comme prévu.
Si vous êtes dérangé par le texte de clavier que vous pouvez utiliser la réflexion pour accéder à la zone privée et réglez l'entrée type de numéro (qui n'est bien sûr pas recommandé, sauf si vraiment nécessaire). Le champ est appelé "mInputText", ou "mText", si vous ciblez les oldies goldies comme le pain d'épices.