基础复习——选择按钮——复选框CheckBox——开关按钮Switch——单选按钮RadioButton——提醒对话框AlertDialog——日期对话框DatePickerDialog——时间对话框TimePickerDialog

CompoundButton类是抽象的复合按钮,由它派生而来的子类包括:复选框CheckBox、单选按钮RadioButton以及开关按钮Switch。
下图描述了复合按钮的继承关系:



// 该页面实现了接口OnCheckedChangeListener,意味着要重写勾选监听器的onCheckedChanged方法
public class CheckBoxActivity extends AppCompatActivity implements CompoundButton.OnCheckedChangeListener
{
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_check_box);
CheckBox ck_system = findViewById(R.id.ck_system); // 从布局文件中获取名叫ck_system的复选框
// 给ck_system设置勾选监听器,一旦用户点击复选框,就触发监听器的onCheckedChanged方法
ck_system.setOnCheckedChangeListener(this);
}
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked)
{
String desc = String.format("您%s了这个CheckBox", isChecked ? "勾选" : "取消勾选");
buttonView.setText(desc);
}
}





布局:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:padding="5dp" > <CheckBox android:id="@+id/ck_system" android:layout_width="match_parent" android:layout_height="wrap_content" android:padding="5dp" android:checked="false" android:text="这是系统的CheckBox" android:textColor="@color/black" android:textSize="17sp" /> <CheckBox android:id="@+id/ck_custom" android:layout_width="match_parent" android:layout_height="wrap_content" android:button="@drawable/checkbox_selector" android:padding="5dp" android:checked="false" android:text="这个CheckBox换了图标" android:textColor="@color/black" android:textSize="17sp" /> </LinearLayout>

代码:
package com.example.myapplication; import android.annotation.SuppressLint; import android.os.Bundle; import android.widget.CheckBox; import android.widget.CompoundButton; import android.widget.Toast; import androidx.appcompat.app.AppCompatActivity; @SuppressLint("DefaultLocale") // 该页面实现了接口OnCheckedChangeListener,意味着要重写勾选监听器的onCheckedChanged方法 public class CheckBoxActivity extends AppCompatActivity implements CompoundButton.OnCheckedChangeListener { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_check_box); // 从布局文件中获取名叫ck_system的复选框 CheckBox ck_system = findViewById(R.id.ck_system); // 从布局文件中获取名叫ck_custom的复选框 CheckBox ck_custom = findViewById(R.id.ck_custom); // 给ck_system设置勾选监听器,一旦用户点击复选框,就触发监听器的onCheckedChanged方法 ck_system.setOnCheckedChangeListener(this); // 给ck_custom设置勾选监听器,一旦用户点击复选框,就触发监听器的onCheckedChanged方法 ck_custom.setOnCheckedChangeListener(this); // 给ck_system设置勾选监听器,一旦用户点击复选框,就触发监听器的onCheckedChanged方法 //ck_system.setOnCheckedChangeListener(new CheckListener()); // 给ck_custom设置勾选监听器,一旦用户点击复选框,就触发监听器的onCheckedChanged方法 //ck_custom.setOnCheckedChangeListener(new CheckListener()); } @Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { String desc = String.format("您%s了这个CheckBox", isChecked ? "勾选" : "取消勾选"); buttonView.setText(desc); } // 定义一个勾选监听器,它实现了接口CompoundButton.OnCheckedChangeListener private class CheckListener implements CompoundButton.OnCheckedChangeListener { // 在用户点击复选框时触发 @Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { String desc = String.format("您勾选了控件%d,状态为%b", buttonView.getId(), isChecked); Toast.makeText(CheckBoxActivity.this, desc, Toast.LENGTH_LONG).show(); } } }


checkbox_selector.xml
<?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:state_checked="true" android:drawable="@drawable/check_choose"/> <item android:drawable="@drawable/check_unchoose"/> </selector>






PS:单独按钮识别:
package com.example.myapplication; import android.annotation.SuppressLint; import android.os.Bundle; import android.widget.CheckBox; import android.widget.CompoundButton; import android.widget.Toast; import androidx.appcompat.app.AppCompatActivity; @SuppressLint("DefaultLocale") // 该页面实现了接口OnCheckedChangeListener,意味着要重写勾选监听器的onCheckedChanged方法 public class CheckBoxActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_check_box); // 从布局文件中获取名叫ck_system的复选框 CheckBox ck_system = findViewById(R.id.ck_system); // 从布局文件中获取名叫ck_custom的复选框 CheckBox ck_custom = findViewById(R.id.ck_custom); // 给ck_system设置勾选监听器,一旦用户点击复选框,就触发监听器的onCheckedChanged方法 ck_system.setOnCheckedChangeListener(new CheckListener()); // 给ck_custom设置勾选监听器,一旦用户点击复选框,就触发监听器的onCheckedChanged方法 ck_custom.setOnCheckedChangeListener(new CheckListener()); } // 定义一个勾选监听器,它实现了接口CompoundButton.OnCheckedChangeListener private class CheckListener implements CompoundButton.OnCheckedChangeListener { // 在用户点击复选框时触发 @Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { if ( buttonView.getId() == R.id.ck_system ) { Toast.makeText(CheckBoxActivity.this, "desc", Toast.LENGTH_LONG).show(); } } } }
======================================================================================================







布局:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:padding="5dp" > <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" > <TextView android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="1" android:gravity="left|center_vertical" android:text="Switch开关:" android:textColor="@color/black" android:textSize="17sp" /> <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="vertical" > <Switch android:id="@+id/sw_status" android:layout_width="80dp" android:layout_height="30dp" /> </LinearLayout> </LinearLayout> <TextView android:id="@+id/tv_result" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="5dp" android:gravity="left" android:textColor="@color/black" android:textSize="17sp" /> </LinearLayout>

代码:
package com.example.myapplication; import android.os.Bundle; import android.widget.CompoundButton; import android.widget.CompoundButton.OnCheckedChangeListener; import android.widget.Switch; import android.widget.TextView; import androidx.appcompat.app.AppCompatActivity; public class SwitchDefaultActivity extends AppCompatActivity implements OnCheckedChangeListener { private Switch sw_status; // 声明一个开关按钮对象 private TextView tv_result; // 声明一个文本视图对象 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_switch_default); // 从布局文件中获取名叫sw_status的开关按钮 sw_status = findViewById(R.id.sw_status); // 从布局文件中获取名叫tv_result的文本视图 tv_result = findViewById(R.id.tv_result); // 给开关按钮设置选择监听器,一旦用户点击它,就触发监听器的onCheckedChanged方法 sw_status.setOnCheckedChangeListener(this); refreshResult(); // 刷新Switch按钮的开关说明 } // 刷新Switch按钮的开关说明 private void refreshResult() { String result = String.format("Switch按钮的状态是%s",(sw_status.isChecked()) ? "开" : "关"); tv_result.setText(result); } // 选择事件的处理方法 @Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { refreshResult(); } }





仿IOS:
布局:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:padding="5dp" > <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" > <TextView android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="1" android:gravity="left|center_vertical" android:text="仿iOS的开关:" android:textColor="@color/black" android:textSize="17sp" /> <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="vertical" > <CheckBox android:id="@+id/ck_status" android:layout_width="60dp" android:layout_height="30dp" android:background="@drawable/switch_selector" android:button="@null" /> </LinearLayout> </LinearLayout> <TextView android:id="@+id/tv_result" android:layout_width="match_parent" android:layout_height="wrap_content" android:paddingTop="5dp" android:gravity="left" android:textColor="@color/black" android:textSize="17sp" /> </LinearLayout>

代码:
package com.example.myapplication; import android.os.Bundle; import android.widget.CheckBox; import android.widget.CompoundButton; import android.widget.CompoundButton.OnCheckedChangeListener; import android.widget.TextView; import androidx.appcompat.app.AppCompatActivity; public class SwitchIOSActivity extends AppCompatActivity implements OnCheckedChangeListener { private CheckBox ck_status; // 声明一个复选框对象 private TextView tv_result; // 声明一个文本视图对象 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_switch_iosactivity); // 从布局文件中获取名叫sw_status的开关按钮 ck_status = findViewById(R.id.ck_status); // 从布局文件中获取名叫tv_result的文本视图 tv_result = findViewById(R.id.tv_result); // 给开关按钮设置选择监听器,一旦用户点击它,就触发监听器的onCheckedChanged方法 ck_status.setOnCheckedChangeListener(this); refreshResult(); // 刷新仿iOS按钮的开关说明 } // 刷新仿iOS按钮的开关说明 private void refreshResult() { String result = String.format("仿iOS开关的状态是%s", (ck_status.isChecked()) ? "开" : "关"); tv_result.setText(result); } // 选择事件的处理方法 public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { refreshResult(); } }


switch_selector.xml
<?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:state_checked="true" android:drawable="@drawable/switch_on"/> <item android:drawable="@drawable/switch_off"/> </selector>




PS:单个按钮:
package com.example.myapplication; import android.os.Bundle; import android.widget.CheckBox; import android.widget.CompoundButton; import android.widget.CompoundButton.OnCheckedChangeListener; import android.widget.TextView; import androidx.appcompat.app.AppCompatActivity; public class SwitchIOSActivity extends AppCompatActivity implements OnCheckedChangeListener { private CheckBox ck_status; // 声明一个复选框对象 private TextView tv_result; // 声明一个文本视图对象 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_switch_iosactivity); // 从布局文件中获取名叫sw_status的开关按钮 ck_status = findViewById(R.id.ck_status); // 从布局文件中获取名叫tv_result的文本视图 tv_result = findViewById(R.id.tv_result); // 给开关按钮设置选择监听器,一旦用户点击它,就触发监听器的onCheckedChanged方法 ck_status.setOnCheckedChangeListener(this); refreshResult(); // 刷新仿iOS按钮的开关说明 } // 刷新仿iOS按钮的开关说明 private void refreshResult() { String result = String.format("仿iOS开关的状态是%s", (ck_status.isChecked()) ? "开" : "关"); tv_result.setText(result); } // 选择事件的处理方法 public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { if( buttonView.getId() == R.id.ck_status ) { refreshResult(); } } }
=========================================================================================================







布局:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:padding="5dp" > <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:text="请选择您的性别" android:textColor="@color/black" android:textSize="17sp" /> <RadioGroup android:id="@+id/rg_sex" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" > <RadioButton android:id="@+id/rb_male" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:checked="false" android:text="男" android:textColor="@color/black" android:textSize="17sp" /> <RadioButton android:id="@+id/rb_female" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:checked="false" android:text="女" android:textColor="@color/black" android:textSize="17sp" /> </RadioGroup> <TextView android:id="@+id/tv_sex" android:layout_width="match_parent" android:layout_height="wrap_content" android:textColor="@color/black" android:textSize="17sp" /> </LinearLayout>

代码:
package com.example.myapplication; import android.os.Bundle; import android.widget.RadioGroup; import android.widget.TextView; import android.widget.Toast; import androidx.appcompat.app.AppCompatActivity; // 该页面实现了接口OnCheckedChangeListener,意味着要重写选中监听器的onCheckedChanged方法 public class RadioHorizontalActivity extends AppCompatActivity implements RadioGroup.OnCheckedChangeListener { private TextView tv_sex; // 声明一个文本视图对象 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_radio_horizontal); // 从布局文件中获取名叫tv_sex的文本视图 tv_sex = findViewById(R.id.tv_sex); // 从布局文件中获取名叫rg_sex的单选组 RadioGroup rg_sex = findViewById(R.id.rg_sex); // 设置单选监听器,一旦点击组内的单选按钮,就触发监听器的onCheckedChanged方法 rg_sex.setOnCheckedChangeListener(this); // 设置单选监听器,一旦点击组内的单选按钮,就触发监听器的onCheckedChanged方法 //rg_sex.setOnCheckedChangeListener(new RadioListener()); } // 在用户点击组内的单选按钮时触发 @Override public void onCheckedChanged(RadioGroup group, int checkedId) { if (checkedId == R.id.rb_male) { tv_sex.setText("哇哦,你是个帅气的男孩"); } else if (checkedId == R.id.rb_female) { tv_sex.setText("哇哦,你是个漂亮的女孩"); } } // 定义一个单选监听器,它实现了接口RadioGroup.OnCheckedChangeListener class RadioListener implements RadioGroup.OnCheckedChangeListener { // 在用户点击组内的单选按钮时触发 @Override public void onCheckedChanged(RadioGroup group, int checkedId) { Toast.makeText(RadioHorizontalActivity.this, "您选中了控件"+checkedId, Toast.LENGTH_LONG).show(); } } }





PS:
package com.example.myapplication; import android.os.Bundle; import android.widget.RadioGroup; import android.widget.TextView; import android.widget.Toast; import androidx.appcompat.app.AppCompatActivity; // 该页面实现了接口OnCheckedChangeListener,意味着要重写选中监听器的onCheckedChanged方法 public class RadioHorizontalActivity extends AppCompatActivity { private TextView tv_sex; // 声明一个文本视图对象 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_radio_horizontal); // 从布局文件中获取名叫tv_sex的文本视图 tv_sex = findViewById(R.id.tv_sex); // 从布局文件中获取名叫rg_sex的单选组 RadioGroup rg_sex = findViewById(R.id.rg_sex); // 设置单选监听器,一旦点击组内的单选按钮,就触发监听器的onCheckedChanged方法 rg_sex.setOnCheckedChangeListener(new RadioListener()); } // 定义一个单选监听器,它实现了接口RadioGroup.OnCheckedChangeListener class RadioListener implements RadioGroup.OnCheckedChangeListener { // 在用户点击组内的单选按钮时触发 @Override public void onCheckedChanged(RadioGroup group, int checkedId) { Toast.makeText(RadioHorizontalActivity.this, "您选中了控件"+checkedId, Toast.LENGTH_LONG).show(); } } }


布局:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:padding="5dp" > <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:text="请选择您的婚姻状况" android:textColor="@color/black" android:textSize="17sp" /> <RadioGroup android:id="@+id/rg_marry" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical" > <!-- 通过button属性修改单选按钮的图标 --> <RadioButton android:id="@+id/rb_unmarried" android:layout_width="wrap_content" android:layout_height="wrap_content" android:padding="5dp" android:button="@drawable/radio_selector" android:text="未婚" android:textColor="@color/black" android:textSize="17sp" /> <!-- 通过drawableLeft属性修改单选按钮的图标 --> <RadioButton android:id="@+id/rb_married" android:layout_width="wrap_content" android:layout_height="wrap_content" android:padding="5dp" android:button="@null" android:drawableLeft="@drawable/radio_selector" android:drawablePadding="10dp" android:text="已婚" android:textColor="@color/black" android:textSize="17sp" /> </RadioGroup> <TextView android:id="@+id/tv_marry" android:layout_width="match_parent" android:layout_height="wrap_content" android:textColor="@color/black" android:textSize="17sp" /> </LinearLayout>

代码:
package com.example.myapplication; import android.os.Bundle; import android.widget.RadioGroup; import android.widget.TextView; import androidx.appcompat.app.AppCompatActivity; // 该页面实现了接口OnCheckedChangeListener,意味着要重写选中监听器的onCheckedChanged方法 public class RadioVerticalActivity extends AppCompatActivity implements RadioGroup.OnCheckedChangeListener { private TextView tv_marry; // 声明一个文本视图对象 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_radio_vertical); // 从布局文件中获取名叫tv_marry的文本视图 tv_marry = findViewById(R.id.tv_marry); // 从布局文件中获取名叫rg_marry的单选组 RadioGroup rg_marry = findViewById(R.id.rg_marry); // 给rg_marry设置单选监听器,一旦用户点击组内的单选按钮,就触发监听器的onCheckedChanged方法 rg_marry.setOnCheckedChangeListener(this); } // 在用户点击组内的单选按钮时触发 public void onCheckedChanged(RadioGroup group, int checkedId) { if (checkedId == R.id.rb_married) { tv_marry.setText("哇哦,祝你早生贵子"); } else if (checkedId == R.id.rb_unmarried) { tv_marry.setText("哇哦,你的前途不可限量"); } } }

radio_selector.xml
<?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:state_checked="true" android:drawable="@drawable/radio_choose"/> <item android:drawable="@drawable/radio_unchoose"/> </selector>






======================================================================================================================

AlertDialog可以完成常见的交互操作,例如提示、确认、选择等功能。AlertDialog借助建造器AlertDialog.Builder才能完成参数设置,
AlertDialog.Builder的常用方法说明如下。
setIcon:设置对话框的标题图标。
setTitle:设置对话框的标题文本。
setMessage:设置对话框的内容文本。
setPositiveButton:设置肯定按钮的信息,包括按钮文本和点击监听器。
setNegativeButton:设置否定按钮的信息,包括按钮文本和点击监听器。
setNeutralButton:设置中性按钮的信息,包括按钮文本和点击监听器。
调用建造器的create方法生成对话框实例,再调用对话框实例的show方法,在页面上弹出提醒对话框。




布局:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <Button android:id="@+id/btn_alert" android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="center" android:text="弹出提醒对话框" android:textColor="@color/black" android:textSize="17sp" /> <TextView android:id="@+id/tv_alert" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginLeft="5dp" android:textColor="@color/black" android:textSize="17sp" /> </LinearLayout>

代码:
package com.example.myapplication; import android.app.AlertDialog; import android.content.DialogInterface; import android.os.Bundle; import android.view.View; import android.widget.TextView; import androidx.appcompat.app.AppCompatActivity; public class AlertDialogActivity extends AppCompatActivity implements View.OnClickListener { private TextView tv_alert; // 声明一个文本视图对象 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_alert_dialog); // 给btn_alert设置点击监听器,一旦用户点击按钮,就触发监听器的onClick方法 findViewById(R.id.btn_alert).setOnClickListener(this); // 从布局文件中获取名叫tv_alert的文本视图 tv_alert = findViewById(R.id.tv_alert); } @Override public void onClick(View v) { if (v.getId() == R.id.btn_alert) { // 创建提醒对话框的建造器 AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setTitle("尊敬的用户"); // 设置对话框的标题文本 builder.setMessage("你真的要卸载我吗?"); // 设置对话框的内容文本 // 设置对话框的肯定按钮文本及其点击监听器 builder.setPositiveButton("残忍卸载", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { tv_alert.setText("虽然依依不舍,但是只能离开了"); } }); // 设置对话框的否定按钮文本及其点击监听器 builder.setNegativeButton("我再想想", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { tv_alert.setText("让我再陪你三百六十五个日夜"); } }); AlertDialog alert = builder.create(); // 根据建造器构建提醒对话框对象 alert.show(); // 显示提醒对话框 } } }





=======================================================================================================

日期选择器DatePicker可以让用户选择具体的年月日。
但DatePicker并非弹窗模式,而是在当前页面占据一块区域,并且不会自动关闭。
DatePickerDialog相当于在AlertDialog上装载了DatePicker,日期选择事件则由监听器OnDateSetListener负责响应,
在该监听器的onDateSet方法中,开发者获取用户选择的具体日期,再做后续处理。




布局:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <Button android:id="@+id/btn_date" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="请选择日期" android:textColor="@color/black" android:textSize="17sp" /> <!-- datePickerMode取值spinner表示下拉框风格,取值calendar表示日历风格 --> <DatePicker android:id="@+id/dp_date" android:layout_width="match_parent" android:layout_height="wrap_content" android:calendarViewShown="false" android:datePickerMode="spinner" android:gravity="center" android:spinnersShown="true" /> <Button android:id="@+id/btn_ok" android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="center" android:text="确 定" android:textColor="@color/black" android:textSize="17sp" /> <TextView android:id="@+id/tv_date" android:layout_width="match_parent" android:layout_height="wrap_content" android:paddingLeft="5dp" android:textColor="@color/black" android:textSize="17sp" /> </LinearLayout>

代码:
package com.example.myapplication; import android.annotation.SuppressLint; import android.app.DatePickerDialog; import android.os.Bundle; import android.view.View; import android.widget.DatePicker; import android.widget.TextView; import androidx.appcompat.app.AppCompatActivity; import java.util.Calendar; @SuppressLint("DefaultLocale") // 该页面类实现了接口OnDateSetListener,意味着要重写日期监听器的onDateSet方法 public class DatePickerActivity extends AppCompatActivity implements View.OnClickListener, DatePickerDialog.OnDateSetListener { private TextView tv_date; // 声明一个文本视图对象 private DatePicker dp_date; // 声明一个日期选择器对象 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_date_picker); tv_date = findViewById(R.id.tv_date); // 从布局文件中获取名叫dp_date的日期选择器 dp_date = findViewById(R.id.dp_date); findViewById(R.id.btn_date).setOnClickListener(this); findViewById(R.id.btn_ok).setOnClickListener(this); } @Override public void onClick(View v) { if (v.getId() == R.id.btn_date) { // 获取日历的一个实例,里面包含了当前的年月日 Calendar calendar = Calendar.getInstance(); // 构建一个日期对话框,该对话框已经集成了日期选择器。 // DatePickerDialog的第二个构造参数指定了日期监听器 DatePickerDialog dialog = new DatePickerDialog(this, this, calendar.get(Calendar.YEAR), // 年份 calendar.get(Calendar.MONTH), // 月份 calendar.get(Calendar.DAY_OF_MONTH)); // 日子 dialog.show(); // 显示日期对话框 } else if (v.getId() == R.id.btn_ok) { // 获取日期选择器dp_date设定的年月份 String desc = String.format("您选择的日期是%d年%d月%d日", dp_date.getYear(), dp_date.getMonth() + 1, dp_date.getDayOfMonth()); tv_date.setText(desc); } } // 一旦点击日期对话框上的确定按钮,就会触发监听器的onDateSet方法 @Override public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) { // 获取日期对话框设定的年月份 String desc = String.format("您选择的日期是%d年%d月%d日", year, monthOfYear + 1, dayOfMonth); tv_date.setText(desc); } }







===================================================================================================

时间选择器TimePicker可以让用户选择具体的小时和分钟
TimePickerDialog的用法类似DatePickerDialog,不同之处有两个:
(1)构造方法传的是当前的小时与分钟,最后一个参数表示是否采取二十四小时制,一般传true,表示小时的数值范围为0~23;若为false则表示采取十二小时制。
(2)时间选择监听器为OnTimeSetListener,对应需要实现onTimeSet方法,在该方法中可获得用户选择的小时和分钟。





布局:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <Button android:id="@+id/btn_time" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="请选择时间" android:textColor="@color/black" android:textSize="17sp" /> <!-- timePickerMode取值spinner表示下拉框风格,取值clock表示钟表风格 --> <TimePicker android:id="@+id/tp_time" android:layout_width="match_parent" android:layout_height="wrap_content" android:calendarViewShown="false" android:timePickerMode="spinner" android:gravity="center" android:spinnersShown="true" /> <Button android:id="@+id/btn_ok" android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="center" android:text="确 定" android:textColor="@color/black" android:textSize="17sp" /> <TextView android:id="@+id/tv_time" android:layout_width="match_parent" android:layout_height="wrap_content" android:paddingLeft="5dp" android:textColor="@color/black" android:textSize="17sp" /> </LinearLayout>

代码:
package com.example.myapplication;
import android.annotation.SuppressLint;
import android.app.TimePickerDialog;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;
import android.widget.TimePicker;
import androidx.appcompat.app.AppCompatActivity;
import java.util.Calendar;
@SuppressLint("DefaultLocale")
// 该页面类实现了接口OnTimeSetListener,意味着要重写时间监听器的onTimeSet方法
public class TimePickerActivity extends AppCompatActivity implements View.OnClickListener, TimePickerDialog.OnTimeSetListener
{
private TextView tv_time; // 声明一个文本视图对象
private TimePicker tp_time; // 声明一个时间选择器对象
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_time_picker);
tv_time = findViewById(R.id.tv_time);
// 从布局文件中获取名叫tp_time的时间选择器
tp_time = findViewById(R.id.tp_time);
findViewById(R.id.btn_time).setOnClickListener(this);
findViewById(R.id.btn_ok).setOnClickListener(this);
}
@Override
public void onClick(View v)
{
if (v.getId() == R.id.btn_time)
{
// 获取日历的一个实例,里面包含了当前的时分秒
Calendar calendar = Calendar.getInstance();
// 构建一个时间对话框,该对话框已经集成了时间选择器。
// TimePickerDialog的第二个构造参数指定了时间监听器
TimePickerDialog dialog = new TimePickerDialog(this, this,
calendar.get(Calendar.HOUR_OF_DAY), // 小时
calendar.get(Calendar.MINUTE), // 分钟
true); // true表示24小时制,false表示12小时制
dialog.show(); // 显示时间对话框
}
else if (v.getId() == R.id.btn_ok)
{
// 获取时间选择器tp_time设定的小时和分钟
String desc = String.format("您选择的时间是%d时%d分", tp_time.getCurrentHour(), tp_time.getCurrentMinute());
tv_time.setText(desc);
}
}
// 一旦点击时间对话框上的确定按钮,就会触发监听器的onTimeSet方法
@Override
public void onTimeSet(TimePicker view, int hourOfDay, int minute)
{
// 获取时间对话框设定的小时和分钟
String desc = String.format("您选择的时间是%d时%d分", hourOfDay, minute);
tv_time.setText(desc);
}
}







浙公网安备 33010602011771号