OnScrollListenerイベントで処理するよりも便利な方法でそれを行うことは可能ですか?残念ながら、ステップサイズ属性がありません...
6 に答える
AndroidのNumberPickerには、 setDisplayedValuesというメソッドがあります。これを使用してカスタム値を表示し(文字列の配列を取ります)、値が必要なときにそれらをマップできます。したがって、たとえば、分ピッカーで5のステップが必要な場合は、次のような配列を作成できます。
String[] minuteValues = new String[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);
そして、の値を取得したら、OnValueChangeListener
それを整数にキャストバックする必要があります。
Integer.parseInt(minuteValues[newVal]);
たとえば、ステップ数を「5」に設定するには、NumberPicker.Formatterを使用します。
NumberPicker.Formatter formatter = new NumberPicker.Formatter() {
@Override
public String format(int value) {
int temp = value * 5;
return "" + temp;
}
};
numberPicker.setFormatter(formatter);
OnValueChangeListenerを追加してみませんか?
numberPicker.setOnValueChangedListener(new NumberPicker.OnValueChangeListener() {
@Override
public void onValueChange(NumberPicker picker, int oldVal, int newVal) {
picker.setValue((newVal < oldVal)?oldVal-5:oldVal+5);
}
});
AndroidのNumberPickerには、 setDisplayedValuesというメソッドがあります。これを使用してカスタム値を表示し(文字列の配列を取ります)、値が必要なときにそれらをマップできます。
たとえば、次のような関数を作成できます。
public String[] getArrayWithSteps (int iMinValue, int iMaxValue, int iStep)
{
int iStepsArray = (iMaxValue-iMinValue) / iStep+1; //get the lenght array that will return
String[] arrayValues= new String[iStepsArray]; //Create array with length of iStepsArray
for(int i = 0; i < iStepsArray; i++)
{
arrayValues[i] = String.valueOf(iMinValue + (i * iStep));
}
return arrayValues;
}
したがって、メソッド> NumberPicker.setDisplayedValuesを呼び出す必要があります。次に例を示します。
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
NumberPickで値を取得するには:
String sValue = String.valueOf(10+(myNumberPick.getValue()*5)); //->> (iMinValue + (myNumberPick.getValue()*iStep))
上記の方法を使用する場合、ピッカーを使用すると、ユーザーはスクロールだけでなく、キーボードで値を入力することによって値を選択できることに注意する必要があります。
デフォルトでは、入力フィールドの入力タイプはに設定されているTYPE_CLASS_NUMBER
ため、ユーザーには数字キーボードが表示されます。setDisplayedValues
ピッカーを使用するとタイプがに変更されるようですが、入力タイプTYPE_CLASS_TEXT
を使用setFormatter
すると変更されません。
したがって、この場合にフォーマッタを使用すると、予期しない動作が発生する可能性があります。ユーザーが値「0」または「5」のみを選択できるようにしたいとします。あなたはこのようなコードを持っているかもしれません:
NumberPicker numberPicker = (NumberPicker) findViewById(R.id.my_number_picker);
numberPicker.setMinValue(0);
numberPicker.setMaxValue(1);
numberPicker.setFormatter(v -> v == 0 ? "0" : "5");
ただし、このシナリオでは、ユーザーに数字キーボードが表示されますが、入力できるのは「0」または「1」のみです。
代わりに使用する場合:
numberPicker.setDisplayedValues(new String[] { "0", "5" });
ユーザーにはテキストキーボードが表示されますが、期待どおりに「0」または「5」を入力できます。
テキストキーボードが気になる場合は、リフレクションを使用してプライベートフィールドにアクセスし、入力タイプを数値に戻すことができます(もちろん、本当に必要な場合を除いて、これはお勧めしません)。このフィールドは「mInputText」、またはジンジャーブレッドのようなオールディーズのゴールディをターゲットにする場合は「mText」と呼ばれます。
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.
}
これはajpoltソリューションにとってより良いアプローチです
事前定義されたステップサイズで、キーボードを介して設定されたカスタム値をサポートします。
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);
}
}
});
*これは5歳の質問ですが、誰かに役立つかもしれません