android studio 30分钟间隔时间选择器(微调器)

zd287kbt  于 2021-07-03  发布在  Java
关注(0)|答案(1)|浏览(721)

我用的是时间选择器旋转器。我想实施30分钟的间隔。
我使用的代码输出这个效果,如下图所示。

代码如下:

  1. picker.setOnTimeChangedListener(new TimePicker.OnTimeChangedListener() {
  2. @Override
  3. public void onTimeChanged(TimePicker view, int hour, int min) {
  4. timeoutput.setText(String.format("%02dh%02d", hour, min));
  5. }
  6. });
  7. back.setOnClickListener(new View.OnClickListener() {
  8. @Override
  9. public void onClick(View v) {
  10. Intent intent = new Intent(Schedule.this, choosewalk.class);
  11. startActivity(intent);
  12. }
  13. });
  14. @SuppressLint("DefaultLocale")
  15. private void TimeInterval(TimePicker picker) {
  16. try {
  17. int Interval = 30;
  18. NumberPicker minute = (NumberPicker) picker.findViewById(Resources.getSystem().getIdentifier(
  19. "minute", "id", "android"));
  20. minute.setMinValue(0);
  21. minute.setMaxValue((60 / Interval) - 1);
  22. List<String> displayedValue = new ArrayList<String>();
  23. for (int i = 0; i < 60; i += Interval) {
  24. displayedValue.add(String.format("%02d", i));
  25. }
  26. minute.setDisplayedValues(displayedValue.toArray(new String[0]));
  27. } catch (Exception e) {
  28. e.printStackTrace();
  29. }
  30. }

我知道也有类似的问题,但对于这个具体的问题,我很挣扎。我知道这个方法适用于5、10、15等时间间隔。它在30分钟的时间间隔内修改代码是有问题的。

ecr0jaav

ecr0jaav1#

好吧,这是你的问题。你想要一个轮子吗 00 以及 30 你想无限滚动它,所以它从 3000 每一次都增加一个小时轮,对吗?这基本上就是 TimePicker 默认情况下工作。
问题是,从 NumberPicker :
注:如果项目数,即范围( getMaxValue() - getMinValue() )小于选择轮上显示的项目数,选择轮将不缠绕。
max-min是一种非常尴尬的表达方式(项目的数量实际上是+1),但是基本上微调器一次在屏幕上显示三个项目,并且您需要有三个以上的项目(因此至少有一个项目在屏幕外)才能进行 Package 。这就是为什么它适用于你的其他时间间隔(15分钟给你四个项目,这样就结束了)
不幸的是,我不认为有很多你可以做的-没有 Package 是硬编码的行为 NumberPicker . 你可以用四样东西来伪装, 00 , 30 , 00 , 30 但在内部,这仍然是价值观 03 ,一次转动轮子,而不是两次。以及 TimePicker 使用这些值,与 minValue 以及 maxValue 检查车轮何时缠绕,小时需要自动改变。
处理此问题的侦听器(在 TimePickerSpinnerDelegate )不能被阅读,所以你不能把它包在一个听者里假装它在听
0 1 0 1 相反。监听器还引用了一组内部私有变量和方法,因此不能将其复制到自己的代码中并进行调整。您必须根据事物的外观重新实现整个小部件及其相关类
如果对你有用,你可以扔两个 NumberPicker 我们在一起,自己重拍。你会失去像am/pm这样的功能,可能是可访问性,这取决于你是否在意。基本上是这样的:

  1. public class MainActivity extends AppCompatActivity implements NumberPicker.OnValueChangeListener {
  2. private NumberPicker mMinuteSpinner;
  3. private NumberPicker mHourSpinner;
  4. @Override
  5. protected void onCreate(@Nullable Bundle savedInstanceState) {
  6. super.onCreate(savedInstanceState);
  7. setContentView(R.layout.activity_main);
  8. mMinuteSpinner = findViewById(R.id.minPicker);
  9. mHourSpinner = findViewById(R.id.hourPicker);
  10. mMinuteSpinner.setMinValue(0);
  11. mMinuteSpinner.setMaxValue(3);
  12. mMinuteSpinner.setDisplayedValues(new String[]{"00", "30", "00", "30"});
  13. mMinuteSpinner.setOnValueChangedListener(this);
  14. mHourSpinner.setMinValue(0);
  15. mHourSpinner.setMaxValue(23);
  16. String[] hours = new String[24];
  17. for (int i = 0; i < 24; i++) {
  18. hours[i] = Integer.toString(i + 1);
  19. }
  20. mHourSpinner.setDisplayedValues(hours);
  21. }
  22. @Override
  23. public void onValueChange(NumberPicker picker, int oldVal, int newVal) {
  24. boolean advanced = (newVal == 0 && oldVal == 3) || (newVal == 2 && oldVal == 1);
  25. boolean regressed = (newVal == 3 && oldVal == 0) || (newVal == 1 && oldVal == 2);
  26. if (advanced) {
  27. mHourSpinner.setValue(mHourSpinner.getValue() + 1);
  28. } else if (regressed) {
  29. mHourSpinner.setValue(mHourSpinner.getValue() - 1);
  30. }
  31. }
  32. }

好久没碰java了!也许有更好的办法。但是,侦听器只是检查它是否在四项列表上的两个滚动点之间传递(从何处开始) 3000 以一种方式滚动,反之亦然(以另一种方式滚动)。这基本上就是 TimePicker 作品

展开查看全部

相关问题