Получение float/double от NumberPicker

Я пробую библиотеку https://github.com/SimonVT/android-numberpicker и ссылку это https://developer.android.com/reference/android/widget/NumberPicker.html#getValue%28%29 Теперь и API-интерфейс NumberPicker уровня 11 возвращает значение int в методе getValue, и средство выбора чисел SimonVT также возвращает значение int.

Но я установил двойные значения в средстве выбора чисел, используя следующий код:

String[] nums = {"1","1.5","2","2.5","3","3.5","4","4.5","5","5.5","6","6.5","7","7.5","8","8.5","9"};

final NumberPicker listeningScorenp = (NumberPicker) findViewById(R.id.listeningScore);
listeningScorenp.setMaxValue(nums.length-1);
listeningScorenp.setMinValue(0);
listeningScorenp.setWrapSelectorWheel(false);
listeningScorenp.setDisplayedValues(nums);

Теперь я застрял в том, как получить значения float/double из NUmberPicker.


person Piyush-Ask Any Difference    schedule 27.08.2013    source источник


Ответы (2)


Я только что проверил, используя ваш код. getValue() фактически возвращает индекс выбранного элемента (только когда вы устанавливаете отображаемые значения). Все, что вам нужно сделать, это проанализировать строку, и вы получите то, что хотели.

String[] nums = {"1","1.5","2","2.5","3","3.5","4","4.5","5","5.5","6","6.5","7","7.5","8","8.5","9"};
int index = listeningScorenp.getValue();
String val = nums[index];
float selectedFloat = Float.parseFloat(val);
person Randy    schedule 29.08.2013
comment
Также у вас есть возможность использовать NumberPicker.Formatter developer.android.com/ reference/android/widget/ если, например, вы хотите отформатировать поплавок как дроби в своих строках - person Maks; 01.03.2018

В Kotlin вы можете использовать это удобное расширение NumberPicker, которое представляет собой диалоговое окно — под оберткой оно масштабирует ваши значения Double в подходящий диапазон Int и преобразует значения Int обратно в Double перед вызовом любого из обратных вызовов. Таким образом, это в основном скрывает тот факт, что NumberPicker поддерживает только Int. Просто кажется, что NumberPicker на самом деле будет поддерживать Double, попробуйте!

Вот расширение фрагмента, которое можно скопировать и вставить:

fun Fragment.showNumberPickerDialog(
    title: String,
    value: Double,
    range: ClosedRange<Double>,
    stepSize: Double,
    formatToString: (Double) -> String,
    valueChooseAction: (Double) -> Unit
) {
    val numberPicker = NumberPicker(context).apply {
        setFormatter { formatToString(it.toDouble() * stepSize) }
        wrapSelectorWheel = false

        minValue = (range.start / stepSize).toInt()
        maxValue = (range.endInclusive / stepSize).toInt()
        this.value = (value.toDouble() / stepSize).toInt()

        // NOTE: workaround for a bug that rendered the selected value wrong until user scrolled, see also: https://stackoverflow.com/q/27343772/3451975
        (NumberPicker::class.java.getDeclaredField("mInputText").apply { isAccessible = true }.get(this) as EditText).filters = emptyArray()
    }

    MaterialAlertDialogBuilder(context)
        .setTitle(title)
        .setView(numberPicker)
        .setPositiveButton("OK") { _, _ -> valueChooseAction(numberPicker.value.toDouble() * stepSize) }
        .setNeutralButton("Cancel") { _, _ -> /* do nothing, closes dialog automatically */ }
        .show()
}

Затем вы можете использовать его следующим образом:

showNumberPickerDialog(
    title = "Your Weight",
    value = 75.0, // in kilograms
    range = 10.0 .. 300.0,
    formatToString = { "$it kg" },
    valueChooseAction = { saveNewWeight(it) }
)
person Jeehut    schedule 12.01.2020