12
votes

Changer la taille de l'étape d'un numéros numérique

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 ...


0 commentaires

6 Réponses :


7
votes

Pourquoi ne pas simplement ajouter un Onvaluechangelistener Quelque chose comme: < Pré> xxx


3 commentaires

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.



31
votes

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]);


1 commentaires

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 avec 55-i * 5



5
votes

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))


1 commentaires

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



16
votes

4 commentaires

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?



0
votes

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 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é.

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> xxx pré>

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>

    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.
    }


0 commentaires

1
votes

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);
            }

        }
    });


0 commentaires