Android - 在 TimePicker 对话框中禁用(或隐藏)分钟选择

Android - Disable (or Hide) Minute selection in TimePicker Dialog


在我的项目中,我使用 TimePicker 对话框 来允许用户 select 时间。但我不希望他们 select 分钟。所以,我只想 禁用(或隐藏)分钟 selection。 那么,如何做到这一点?

简短的回答是你不能。您必须创建自己的自定义对话框。

长话短说,您可能可以,但不应该。您可以找到视图的 ID 并禁用或隐藏它,但每个版本和制造商可能为此对话框使用不同的 ID,因此您将 运行 遇到许多问题和错误。

Whosebug answer about hiding year

我使用 Material TimePickerDialog Library.

解决了我的问题

我的解决方案:

public class home extends AppCompatActivity implements TimePickerDialog.OnTimeSetListener, ... {
    ...
    private EditText time;
    private TimePickerDialog timePickerDialog;

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

        timePickerDialog = TimePickerDialog.newInstance(home.this, new Date().getHours(), new Date().getMinutes(), false);
        timePickerDialog.enableMinutes(false);

        time = (EditText) findViewById(R.id.time);
        time.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                timePickerDialog.show(getFragmentManager(), "TimePickerDialog");
            }
        });
    }

    @Override
    public void onTimeSet(TimePickerDialog view, int hourOfDay, int minute, int second) {
        String form;
        if (hourOfDay > 12) {
            hourOfDay = hourOfDay - 12;
            form = "PM";
        } else {
            if (hourOfDay == 0) {
                hourOfDay = 12;
            }
            form = "AM";
        }
        time.setText(String.valueOf(hourOfDay) + " " + form);
    }

    ...
}

没有库和简单的时间选择器

time_picker.setIs24HourView(true)
time_picker.currentMinute = 0
time_picker.currentHour = 0
time_picker.findViewById<View>(Resources.getSystem()
       .getIdentifier("hour", "id", "android"))
       .visibility = View.GONE

将 id 标识符更改为您需要隐藏或显示的内容

这解决了我的本地时间选择器组件问题
1. 禁用分钟选择
2.隐藏时间分隔符
3. 当用户选择小时

时禁用从小时到分钟的转换

代码在 kotlin 中。

// Disbale time picker minutes
time_picker.findViewById<View>(Resources.getSystem()
            .getIdentifier("minutes", "id", "android"))
            .visibility = View.GONE
// Disbale time seperator
time_picker.findViewById<View>(Resources.getSystem()
            .getIdentifier("separator", "id", "android"))
            .visibility = View.INVISIBLE

val delegateField = time_picker.javaClass.getDeclaredField("mDelegate")
delegateField.isAccessible = true;
val autoAdvance = delegateField.get(time_picker)
val autoAdvanceField = autoAdvance.javaClass.getDeclaredField("mAllowAutoAdvance")

autoAdvanceField.isAccessible = true
autoAdvanceField.set(autoAdvance, false)

输出: