[Android]只显示月和日的DatePickerDialog

 

前言

 需求要只显示月和日的日历控件,又不想自定义控件,最简单的办法就是隐藏显示年的这个框了,但DatePickerDialog并没有直接提供方法来操作,这里分享一个笨办法:)

 

声明

  欢迎转载,但请保留文章原始出处:) 

    博客园:http://www.cnblogs.com

    农民伯伯: http://over140.cnblogs.com   

 

正文

  一、效果图

    1.1 默认

 

    1.2 处理后 

 

 

  二、实现代码

    2.1  代码片段1

复制代码
    /**
     * 从当前Dialog中查找DatePicker子控件
     * 
     * 
@param group
     * 
@return
     
*/
    
private DatePicker findDatePicker(ViewGroup group) {
        
if (group != null) {
            
for (int i = 0, j = group.getChildCount(); i < j; i++) {
                View child 
= group.getChildAt(i);
                
if (child instanceof DatePicker) {
                    
return (DatePicker) child;
                } 
else if (child instanceof ViewGroup) {
                    DatePicker result 
= findDatePicker((ViewGroup) child);
                    
if (result != null)
                        
return result;
                }
            }
        }
        
return null;

    } 

复制代码
      代码说明:
        通过断点也看到Dialog的ContentView里有DatePicker子控件,这里通过遍历的办法来查找这个控件。

    2.2  使用代码

复制代码
        final Calendar cal = Calendar.getInstance();
        mDialog 
= new CustomerDatePickerDialog(getContext(), this,
            cal.get(Calendar.YEAR), cal.get(Calendar.MONTH),
            cal.get(Calendar.DAY_OF_MONTH));
        mDialog.show();
        
        DatePicker dp 
= findDatePicker((ViewGroup) mDialog.getWindow().getDecorView());
        
if (dp != null) {
            ((ViewGroup) dp.getChildAt(
0)).getChildAt(0).setVisibility(View.GONE);

        } 

复制代码

      代码说明:

        通过源码可以看得到DatePicker内置三个NumberPicker控件,依次表示年、月、日,隐藏掉第一个即可。

 

    三、补充

      后续使用中发现标题栏也要改,通过查看DatePickerDialog源码,需要自定义并实现onDateChanged方法才可实现,如下代码:

复制代码
    class CustomerDatePickerDialog extends DatePickerDialog {

        
public CustomerDatePickerDialog(Context context,
                OnDateSetListener callBack, 
int year, int monthOfYear,
                
int dayOfMonth) {
            
super(context, callBack, year, monthOfYear, dayOfMonth);
        }

        @Override
        
public void onDateChanged(DatePicker view, int year, int month, int day) {
            
super.onDateChanged(view, year, month, day);
            mDialog.setTitle((month 
+ 1+ "" + day + "");
        }
    }
复制代码

 

 

posted @   农民伯伯  阅读(24058)  评论(16编辑  收藏  举报
编辑推荐:
· C++代码改造为UTF-8编码问题的总结
· DeepSeek 解答了困扰我五年的技术问题
· 为什么说在企业级应用开发中,后端往往是效率杀手?
· 用 C# 插值字符串处理器写一个 sscanf
· Java 中堆内存和栈内存上的数据分布和特点
阅读排行:
· 为DeepSeek添加本地知识库
· .NET程序员AI开发基座:Microsoft.Extensions.AI
· 精选4款基于.NET开源、功能强大的通讯调试工具
· 数据不出内网:基于Ollama+OneAPI构建企业专属DeepSeek智能中台
· 大模型工具KTransformer的安装
历史上的今天:
2010-09-20 Android2.2 API 中文文档系列(7) —— ImageButton
2009-09-20 ExtJs 备忘录(3)—— Form表单(三) [ 数据验证 ]
2009-09-20 ExtJs 备忘录(2)—— Form表单(二) [ 控件封装 ]
点击右上角即可分享
微信分享提示