9

アプリのユーザーは、浮動小数点数を調整できる必要があります。現時点では、ArrayAdapterにすべての可能な値を入力し、スピナーに接続しました。

スピナードロップダウンボックスが高すぎるため、このソリューションは実際には私たちの期待に応えていません。もっと良い方法はありますか?私はNumberpickerを見ていましたが、これは整数値でのみ機能するようです。

何か案は?

ありがとう!

4

3 に答える 3

21

NumberPickerFloats 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任意のデータ型を作成して割り当てることができます。

于 2012-12-12T09:41:29.917 に答える
3

もう1つの解決策は、2つの数値フィールドを1つのコンポーネントに結合することです。MoneyPickerの例を参照してください。その利点は、スピナーのすべての可能なdouble値を初期化する必要がないことです。

また、関数を使用して、 「00」「0123」などの特殊な数字のフォーマットを添付する必要がある場合もあります。例はここにあります。java.lang.String.format()

  1. 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>
    
  2. カスタムダブルピッカークラスを追加します。

    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]));
      }
    }
    
  3. アクティビティxmlで新しいダブルピッカーコンポーネントを使用します。

    <com.example.DoublePicker
      android:id ="@+id/double_picker"
      android:layout_width ="match_parent"
      android:layout_height ="wrap_content" />
    
于 2017-06-06T06:42:15.533 に答える
1

Kotlinでは、この便利なNumberPicker拡張ダイアログを使用して、Double値を適切Intな範囲にスケーリングし、コールバックを呼び出す前にInt値をsに戻すことができます。したがって、基本的にはをサポートするだけでDoubleあるという事実を隠します。実際にサポートしてくれるような気がしますので、ぜひお試しください!NumberPickerIntNumberPickerDouble

コピーして貼り付ける必要があるフラグメント拡張機能は次のとおりです。

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) }
)
于 2020-01-12T12:38:38.410 に答える