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

Java android studio 30分钟间隔时间选择器(微调器),java,android,android-studio,kotlin,timepicker,Java,Android,Android Studio,Kotlin,Timepicker,我用的是时间选择器旋转器。我希望实施30分钟间隔。 我正在使用的代码输出此效果,如下图所示。 代码如下: picker.setOnTimeChangedListener(new TimePicker.OnTimeChangedListener() { @Override public void onTimeChanged(TimePicker view, int hour, int min) { timeoutput.setText(String.format

我用的是时间选择器旋转器。我希望实施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();
    }
}
picker.setOnTimeChangedListener(新的TimePicker.OnTimeChangedListener(){
@凌驾
公共void onTimeChanged(时间选择器视图,整数小时,整数分钟){
timeoutput.setText(String.format(“%02dh%02d”,小时,分钟));
}
});
back.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
意向意向=新意向(Schedule.this,choosewalk.class);
星触觉(意向);
}
});
@SuppressLint(“DefaultLocale”)
专用无效时间间隔(时间选择器选择器){
试一试{
整数区间=30;
NumberPicker分钟=(NumberPicker)picker.findViewById(Resources.getSystem().getIdentifier(
“分钟”、“id”、“android”);
分钟。设置最小值(0);
分钟设置最大值((60/间隔)-1);
List displayedValue=new ArrayList();
对于(int i=0;i<60;i+=间隔){
displayedValue.add(String.format(“%02d”,i));
}
minute.setDisplayedValues(displayedValue.toArray(新字符串[0]);
}捕获(例外e){
e、 printStackTrace();
}
}

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

好的,这是您的问题。你想要一个上面有
00
30
的轮子,并且你想要能够无限滚动它,所以它从
30
跳到
00
,并每次递增小时轮子,对吗?这基本上就是默认情况下
时间选择器的工作方式

问题在于:

注意:如果项目数,即范围(
getMaxValue()
-
getMinValue()
)小于选择轮上显示的项目数,则选择轮将不会缠绕

max-min是一种非常尴尬的表达方式(项目数实际上是+1),但基本上微调器一次在屏幕上显示三个项目,并且需要三个以上的项目(因此至少有一个在屏幕外)才能进行包装。这就是为什么is适用于你的其他间歇时间(15分钟给你四个项目,这样就结束了)

不幸的是,我不认为你能对此做太多——缺少包装是
NumberPicker
中的硬编码行为。你可以通过四个项目来伪造它,
00
30
00
30
,但在内部,这仍然是值
0
3
,一次旋转车轮,而不是两次旋转。
TimePicker
使用这些值,与
minValue
maxValue
进行比较,以检查车轮何时已缠绕,以及小时需要自动更改

无法读取处理此问题的侦听器(在
TimePickerSpinnerDelegate
中),因此不能将其包装在一个侦听器中,假装它正在运行
0
1
0
1
。监听器还引用了一组内部私有变量和方法,因此您不能将其复制到自己的代码中并进行调整。您必须根据外观重新实现整个小部件及其相关类


如果它对您有效,您可以将两个
NumberPicker
s扔在一起,然后自己重新制作。您将失去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);
        }
    }

}
public类MainActivity扩展AppCompatActivity实现NumberPicker.OnValueChangeListener{
私人电话号码簿;
私人数字签名器;
@凌驾
创建时受保护的void(@Nullable Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mMinuteSpinner=findviewbyd(R.id.minPicker);
mHourSpinner=findviewbyd(R.id.hourPicker);
mMinuteSpinner.setMinValue(0);
mMinuteSpinner.setMaxValue(3);
mMinuteSpinner.setDisplayedValues(新字符串[]{“00”、“30”、“00”、“30”});
MMINUTESPINER.setOnValueChangedListener(此);
mHourSpinner.setMinValue(0);
mHourSpinner.setMaxValue(23);
字符串[]小时=新字符串[24];
对于(int i=0;i<24;i++){
小时[i]=整数.toString(i+1);
}
mHourSpinner.SetDisplayedValue(小时);
}
@凌驾
public void onValueChange(NumberPicker选择器、int-oldVal、int-newVal){
布尔高级=(newVal==0&&oldVal==3)| |(newVal==2&&oldVal==1);
布尔回归=(newVal==3&&oldVal==0)| |(newVal==1&&oldVal==2);
如果(高级){
mHourSpinner.setValue(mHourSpinner.getValue()+1);
}否则如果(回归){
mHourSpinner.setValue(mHourSpinner.getValue()-1);
}
}
}

好久没碰Java了!也许有更好的办法。但是,是的,侦听器只是检查它是否在四项列表上的两个滚动点之间传递(从
30
00
单向滚动,反之亦然)。这就是
计时器
的基本工作原理

您有什么问题吗?您好。我看过教程和示例代码演示了时间选择器(微调器),以5、10、15计数。如果我每隔5分钟分配5次,我的时间选择器工作正常。但是我想要30分钟的间隔。你看上图,当我指定间隔30时,它只显示0,30,并且停止计数。这是我想解决的问题。@MrAndroid计数器是d