38

NumberPicker が回転するとき、または値が手動で入力されたときに、表示される数値をフォーマットするフォーマッターを備えた NumberPicker があります。これは正常に動作しますが、NumberPicker が最初に表示されsetValue(0)、0 で初期化するとフォーマットされません (0 ではなく "-" として表示されるはずです)。その時点から NumberPicker をスピンするとすぐに、すべてが機能します。

NumberPicker を常に強制的にフォーマットするにはどうすればよいですか? 最初のレンダリング時と、キーボードで数値を手動で入力するときの両方で?

これは私のフォーマッターです

public class PickerFormatter implements Formatter {

 private String mSingle;
 private String mMultiple;

 public PickerFormatter(String single, String multiple) {
    mSingle = single;
    mMultiple = multiple;
 }

 @Override
 public String format(int num) {
    if (num == 0) {
        return "-";
    }
    if (num == 1) {
        return num + " " + mSingle;
    }
    return num + " " + mMultiple;
 }

}

フォーマッターをピッカーに追加しsetFormatter()ます。ピッカーに対して行うことはこれだけです。

    picker.setMaxValue(max);
    picker.setMinValue(min);
    picker.setFormatter(new PickerFormatter(single, multiple));
    picker.setWrapSelectorWheel(wrap);
4

10 に答える 10

27

この厄介な小さなバグにも遭遇しました。この回答の手法を使用して、厄介だが効果的な修正を考え出しました。

NumberPicker picker = (NumberPicker)view.findViewById(id.picker);
picker.setMinValue(1);
picker.setMaxValue(5);
picker.setWrapSelectorWheel(false);
picker.setFormatter(new NumberPicker.Formatter() {
    @Override
    public String format(int value) {
        return my_formatter(value);
    }
});

try {
    Method method = picker.getClass().getDeclaredMethod("changeValueByOne", boolean.class);
    method.setAccessible(true);
    method.invoke(picker, true);
} catch (NoSuchMethodException e) {
    e.printStackTrace();
} catch (IllegalArgumentException e) {
    e.printStackTrace();
} catch (IllegalAccessException e) {
    e.printStackTrace();
} catch (InvocationTargetException e) {
    e.printStackTrace();
}

changeValueByOneナンバーピッカーをインスタンス化した直後にそのプライベートメソッドを呼び出すと、フォーマッターが適切に動作するように十分にキックされるようです。数値ピッカーは、最初の値が正しくフォーマットされた状態できれいに表示されます。私が言ったように、厄介ですが効果的です。

于 2013-09-30T21:20:39.603 に答える
12

私は同じ問題を抱えていたので、setDisplayedValues()代わりにこの方法を使用しました。

int max = 99;
String[] values = new String[99];
values[0] = “-” + mSingle
values[1] = 
for(int i=2; i<=max; i++){
    makeNames[i] = String.valueOf(i) + mMultiple;
}
picker.setMinValue(0);
picker.setMaxValue(max);
picker.setDisplayedValues(values)

ただし、これにより、ユーザーがピッカーで手動で値を設定することはできません。

于 2014-03-04T21:59:11.853 に答える
1

私はそれを呼び出すことによってそれを修正することができました

picker.invalidate();

フォーマッタを設定した直後。

于 2014-11-04T12:00:20.473 に答える
0

選択したインデックスが 0 でない場合の Nikolai の回答が改善されました。パフォーマンスにはあまり適していませんが、問題は修正されています。

for(index in numberPicker.minValue..numberPicker.maxValue) {

        val editView = numberPicker.getChildAt(index-numberPicker.minValue)
        if (editView != null && editView is EditText) {
            // Remove default input filter
            (editView as EditText).filters = arrayOfNulls(0)
        }
    }
于 2019-10-25T19:16:27.337 に答える