Android中自定义日期选择对话框(DatePicker只显示年、月)
程序员文章站
2022-06-07 12:28:31
...
前言
系统提供的DatePicker会完整地显示年、月、日,而且其中的很多样式都不能自己调节。本篇文章所讲的年、月对话框效果如下图所示:
点击“确认”,会进入回调函数,可以获取你选择的年、月信息。
主要代码
CustomDateDialog.java
import android.app.Dialog;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.Window;
import android.widget.DatePicker;
import android.widget.LinearLayout;
import android.widget.TextView;
import java.util.Calendar;
/**
* @author Yingyong Lao
* 创建时间 2021/6/14 16:28
* @version 1.0
*/
public class CustomDateDialog implements View.OnClickListener, DatePicker.OnDateChangedListener {
private Dialog dialog;
private TextView titleTv;//标题
private DatePicker datePicker;//日期选择控件
private TextView confirmTv;//底部的“确认”
private View dialogView;
private OnDateSetListener onDateSetListener;
/**
* 构造器
* @param context 上下文
*/
public CustomDateDialog(Context context){
dialogView = LayoutInflater.from(context).inflate(R.layout.date_dialog, null);
dialog=new Dialog(context,R.style.CustomDateDialog);
titleTv=dialogView.findViewById(R.id.titleTv);
datePicker=dialogView.findViewById(R.id.datePicker);
ViewGroup viewGroup1= (ViewGroup) datePicker.getChildAt(0);
ViewGroup viewGroup2= (ViewGroup) viewGroup1.getChildAt(0);//获取年月日的下拉列表项
if(viewGroup2.getChildCount()==3){//有的机型没有竖线,只有年、月、日
viewGroup2.getChildAt(2).setVisibility(View.GONE);
}else if(viewGroup2.getChildCount()==5){//有的机型有有竖线
viewGroup2.getChildAt(3).setVisibility(View.GONE);
viewGroup2.getChildAt(4).setVisibility(View.GONE);
}
confirmTv=dialogView.findViewById(R.id.confirmTv);
confirmTv.setOnClickListener(this);
}
/**
* 显示对话框
*/
public void show(){
Window window = dialog.getWindow();
window.setContentView(dialogView);//设置对话框窗口的内容视图(这里有个坑,参数不要传R.layout.date_dialog,否则会出现各种问题,比如按钮响应不了点击事件)
window.setLayout(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.MATCH_PARENT);//设置对话框窗口的布局参数
dialog.show();
dialog.setCancelable(false);
}
/**
* 关闭对话框
*/
public void dismiss(){
if(dialog!=null&&dialog.isShowing()){
dialog.dismiss();
}
}
/**
* 设置标题
* @param title 标题
*/
public void setTitle(String title){
titleTv.setText(title);
}
public void setDate(int year,int month,OnDateSetListener onDateSetListener){
Calendar calendar = Calendar.getInstance();
datePicker.init(year,month,calendar.get(Calendar.DAY_OF_MONTH),this);
this.onDateSetListener=onDateSetListener;
}
@Override
public void onClick(View v) {
if(v.getId()==R.id.confirmTv){
dialog.dismiss();
if(onDateSetListener!=null){
datePicker.clearFocus();
int year = datePicker.getYear();
int month = datePicker.getMonth();
int day = datePicker.getDayOfMonth();
onDateSetListener.onDateSet(year,month+1);
}
}
}
@Override
public void onDateChanged(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
datePicker.init(year,monthOfYear,dayOfMonth,this);
}
public interface OnDateSetListener{
void onDateSet(int year,int month);
}
}
MainActivity.java
public class MainActivity extends AppCompatActivity {
private CustomDateDialog dialog;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
findViewById(R.id.btn).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
dialog=new CustomDateDialog(MainActivity.this);
Calendar calendar=Calendar.getInstance();
dialog.setDate(calendar.get(Calendar.YEAR), calendar.get(Calendar.MONTH), new CustomDateDialog.OnDateSetListener() {
@Override
public void onDateSet(int year, int month) {
Toast.makeText(MainActivity.this, ""+year+month, Toast.LENGTH_LONG).show();
}
});
dialog.show();
}
});
}
}
源码
项目已经托管到了码云上,上面我只贴了两个java文件的代码,但是项目中的界面布局、背景xml以及样式style等我就不贴了。点我下载源码
上一篇: 代码重构-有意义的命名