アプリのユーザーは、浮動小数点数を調整できる必要があります。現時点では、ArrayAdapterにすべての可能な値を入力し、スピナーに接続しました。
スピナードロップダウンボックスが高すぎるため、このソリューションは実際には私たちの期待に応えていません。もっと良い方法はありますか?私はNumberpickerを見ていましたが、これは整数値でのみ機能するようです。
何か案は?
ありがとう!
アプリのユーザーは、浮動小数点数を調整できる必要があります。現時点では、ArrayAdapterにすべての可能な値を入力し、スピナーに接続しました。
スピナードロップダウンボックスが高すぎるため、このソリューションは実際には私たちの期待に応えていません。もっと良い方法はありますか?私はNumberpickerを見ていましたが、これは整数値でのみ機能するようです。
何か案は?
ありがとう!
NumberPicker
Floats
String
整数だけではありません。なども使用できます。
これを見て、それについて読んでください。
チュートリアルの場合:
そして、私はNumberPicker
ずっと前にこのように使用していました、そしてそれはここに投稿するいくつかの使用かもしれません:
NumberPicker np;
String nums[]= {"Select Fraction","1/64","1/32","3/64","1/16","5/64","3/32","7/64","1/8","9/64","5/32","11/64","3/16","13/64","7/32","15/64","1/4","17/64","9/32","19/64","5/16","21/64","11/32","23/64","3/8","25/64","13/32","27/64","7/16","29/64"};
np = (NumberPicker) findViewById(R.id.np);
np.setMaxValue(nums.length-1);
np.setMinValue(0);
np.setWrapSelectorWheel(false);
np.setDisplayedValues(nums);
np.setDescendantFocusability(NumberPicker.FOCUS_BLOCK_DESCENDANTS);
ArrayList
任意のデータ型を作成して割り当てることができます。
もう1つの解決策は、2つの数値フィールドを1つのコンポーネントに結合することです。MoneyPickerの例を参照してください。その利点は、スピナーのすべての可能なdouble値を初期化する必要がないことです。
また、関数を使用して、 「00」、「0123」などの特殊な数字のフォーマットを添付する必要がある場合もあります。例はここにあります。java.lang.String.format()
Double Picker xml-layoutを追加します:
<LinearLayout
xmlns:android = "http://schemas.android.com/apk/res/android"
android:layout_width = "fill_parent"
android:layout_height = "wrap_content"
android:gravity = "center">
<NumberPicker
android:id = "@+id/integer_picker"
android:layout_width = "wrap_content"
android:layout_height = "wrap_content"
android:layout_gravity = "center"/>
<TextView
android:layout_width = "wrap_content"
android:layout_height = "wrap_content"
android:layout_gravity = "center"
android:padding = "5dp"
android:text = "@string/local_separator"
android:textSize = "20sp"/>
<NumberPicker
android:id = "@+id/fraction_picker"
android:layout_width = "wrap_content"
android:layout_height = "wrap_content"
android:layout_gravity = "center"/>
<TextView
android:layout_width = "wrap_content"
android:layout_height = "wrap_content"
android:layout_gravity = "center"
android:padding = "5dp"
android:text = "@string/measure_unit_sign"
android:textSize = "20sp"/>
</LinearLayout>
カスタムダブルピッカークラスを追加します。
import android.content.Context;
import android.view.LayoutInflater;
import android.widget.NumberPicker;
/**
* UI component for double (floating point) values. Can be used
* for money and other measures.
*/
public class DoublePicker
extends NumberPicker {
private int decimals;
private NumberPicker integerPicker;
private NumberPicker fractionPicker;
public DoublePicker(
Context context) {
super(
context);
LayoutInflater
.from(
context)
.inflate(
R.layout.double_picker,
this);
integerPicker =
(NumberPicker) findViewById(
R.id.integer_picker);
fractionPicker =
(NumberPicker) findViewById(
R.id.fraction_picker);
}
public int getDecimals() {
return decimals;
}
/**
* Sets the amount of digits after separator.
*
* @param decimals Anount of decimals.
*/
public void setDecimals(final int decimals) {
this.decimals = decimals;
this.setFormatter(new DoublePicker.Formatter() {
@Override
public String format(int i) {
return String.format(
"%." + decimals + "f",
i);
}
});
}
public void setValue(double value) {
integerPicker.setValue((int) value);
fractionPicker.setValue(
Integer.valueOf(
String
.valueOf(value)
.split(".")
[1]));
}
}
アクティビティxmlで新しいダブルピッカーコンポーネントを使用します。
<com.example.DoublePicker
android:id ="@+id/double_picker"
android:layout_width ="match_parent"
android:layout_height ="wrap_content" />
Kotlinでは、この便利なNumberPicker
拡張ダイアログを使用して、Double
値を適切Int
な範囲にスケーリングし、コールバックを呼び出す前にInt
値をsに戻すことができます。したがって、基本的にはをサポートするだけで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()
}
これで、次のように使用できます(でFragment
):
showNumberPickerDialog(
title = "Your Weight",
value = 75.0, // in kilograms
range = 10.0 .. 300.0,
stepSize = 0.1,
formatToString = { "$it kg" },
valueChooseAction = { saveNewWeight(it) }
)