Android 控件演示 - 日期对话框

DatePickerDialog 是 Android 中常用的一个控件,主要是用来让用户可以选择时间。

在本文中,我们构造一个文本输入框和一个按钮,当用户按下按钮时,显示日期选择对话框,用户选择日期并确认后,选择的日期被显示在文本框中。

构造界面

加入文本框和按钮,完整xml定义文件如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">

<Button
android:id="@+id/btnPickDate"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="161dp"
android:layout_marginTop="110dp"
android:layout_marginEnd="161dp"
android:text="获取时间"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />

<EditText
android:id="@+id/txtDate"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="15dp"
android:ems="10"
android:inputType="date"
app:layout_constraintEnd_toEndOf="@+id/btnPickDate"
app:layout_constraintStart_toStartOf="@+id/btnPickDate"
app:layout_constraintTop_toBottomOf="@+id/btnPickDate" />
</androidx.constraintlayout.widget.ConstraintLayout>

加入日期选择对话框

Android 已经封装一个 DatePickerDialog 用于选择日期。 其构造函数定义如下:

1
public DatePickerDialog(Context context, OnDateSetListener callBack, int year, int monthOfYear, int dayOfMonth)

其中参数:
context - 上下文,通常给当前Activity的实例
callback - 用户选择完成后的回调函数
year, monthOfYear, dayOfMonth - 这三个参数分别为初始化的年月日

我们将显示日期选择框的代码定义在一个单独的函数中,以便于维护

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
private void showDatePickDlg() {
Calendar calendar = Calendar.getInstance();
int year = calendar.get(Calendar.YEAR);
int month = calendar.get(Calendar.MONTH);
int day = calendar.get(Calendar.DAY_OF_MONTH);

DatePickerDialog datePickerDialog = new DatePickerDialog(MainActivity.this, new DatePickerDialog.OnDateSetListener() {

@Override
public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
MainActivity.this.txtDate.setText(formatDate(year, monthOfYear + 1, dayOfMonth));
}
}, year, month, day);
datePickerDialog.show();
}

在上面的代码中,我们每次获取系统当前的日期作为初始化的日期。在回调函数中,我们将用户选择的值格式化后赋到文本框,显示给用户。

完整的 MainActivity.java 文件代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
public class MainActivity extends AppCompatActivity {

private static final String TAG = MainActivity.class.getSimpleName();

@BindView(R.id.txtDate) EditText txtDate;

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

ButterKnife.bind(this);
}

@OnClick(R.id.btnCustomToast) void onCustomToast() {
Log.d(TAG, "onClicked");
LayoutInflater li = getLayoutInflater();
View layout = li.inflate(R.layout.custom_toast,(ViewGroup) findViewById(R.id.custom_toast_layout));


Toast toast = new Toast(getApplicationContext());
toast.setDuration(Toast.LENGTH_SHORT);
toast.setGravity(Gravity.CENTER_VERTICAL, 0, 0);
toast.setView(layout);
toast.show();
}

@OnClick(R.id.btnPickDate) void onPickDate() {

showDatePickDlg();
}

private void showDatePickDlg() {
Calendar calendar = Calendar.getInstance();
int year = calendar.get(Calendar.YEAR);
int month = calendar.get(Calendar.MONTH);
int day = calendar.get(Calendar.DAY_OF_MONTH);

DatePickerDialog datePickerDialog = new DatePickerDialog(MainActivity.this, new DatePickerDialog.OnDateSetListener() {

@Override
public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
MainActivity.this.txtDate.setText(formatDate(year, monthOfYear + 1, dayOfMonth));
}
}, year, month, day);
datePickerDialog.show();
}

private static final String DATE_FORMATE_SHORT = "yyyy-MM-dd";
private String formatDate(int year, int month, int day) {
LocalDate date = LocalDate.of(year, month, day);
DateTimeFormatter formatter = DateTimeFormatter.ofPattern(DATE_FORMATE_SHORT);
return date.format(formatter);
}

}

在代码中,使用了 butterknife 来简化控件和事件的绑定,如果对这部分内容不熟悉,请参考 在Android中使用注解绑定控件和事件

本文标题:Android 控件演示 - 日期对话框

文章作者:晨星

发布时间:2019年08月09日 - 11:08

最后更新:2020年05月28日 - 16:05

原始链接:https://www.mls-tech.info/app/android/android-widget-datepickerdialog/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。