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

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

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

代码如下:

picker.setOnTimeChangedListener(new TimePicker.OnTimeChangedListener() {
    @Override
    public void onTimeChanged(TimePicker view, int hour, int min) {

        timeoutput.setText(String.format("%02dh%02d", hour, min));
    }
});

back.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        Intent intent = new Intent(Schedule.this, choosewalk.class);
        startActivity(intent);
    }
});

@SuppressLint("DefaultLocale")
private void TimeInterval(TimePicker picker) {
    try {
        int Interval = 30;
        NumberPicker minute = (NumberPicker) picker.findViewById(Resources.getSystem().getIdentifier(
            "minute", "id", "android"));
        minute.setMinValue(0);
        minute.setMaxValue((60 / Interval) - 1);
        List<String> displayedValue = new ArrayList<String>();
        for (int i = 0; i < 60; i += Interval) {
            displayedValue.add(String.format("%02d", i));
        }
        minute.setDisplayedValues(displayedValue.toArray(new String[0]));
    } catch (Exception e) {
        e.printStackTrace();
    }
}

我知道也有类似的问题,但对于这个具体的问题,我很挣扎。我知道这个方法适用于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这样的功能,可能是可访问性,这取决于你是否在意。基本上是这样的:

public class MainActivity extends AppCompatActivity implements NumberPicker.OnValueChangeListener {

    private NumberPicker mMinuteSpinner;
    private NumberPicker mHourSpinner;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mMinuteSpinner = findViewById(R.id.minPicker);
        mHourSpinner = findViewById(R.id.hourPicker);

        mMinuteSpinner.setMinValue(0);
        mMinuteSpinner.setMaxValue(3);
        mMinuteSpinner.setDisplayedValues(new String[]{"00", "30", "00", "30"});
        mMinuteSpinner.setOnValueChangedListener(this);

        mHourSpinner.setMinValue(0);
        mHourSpinner.setMaxValue(23);
        String[] hours = new String[24];
        for (int i = 0; i < 24; i++) {
            hours[i] = Integer.toString(i + 1);
        }
        mHourSpinner.setDisplayedValues(hours);
    }

    @Override
    public void onValueChange(NumberPicker picker, int oldVal, int newVal) {
        boolean advanced = (newVal == 0 && oldVal == 3) || (newVal == 2 && oldVal == 1);
        boolean regressed = (newVal == 3 && oldVal == 0) || (newVal == 1 && oldVal == 2);
        if (advanced) {
            mHourSpinner.setValue(mHourSpinner.getValue() + 1);
        } else if (regressed) {
            mHourSpinner.setValue(mHourSpinner.getValue() - 1);
        }
    }

}

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

相关问题