文档章节

android4.0 以后关于DatePicker的显示问题

崔同亮
 崔同亮
发布于 2016/03/02 15:04
字数 1155
阅读 347
收藏 1
点赞 2
评论 0

        在学习DatePicker控件时,我们发现网上有好多不同版本的界面。如下图所示:

        Android4.0以前的版本显示的效果图:

 


       Android4.0版本以后的显示效果:

       为此有的码友希望能够显示以前的效果,那么有两种解决方法:

       第一种解决方法是修改主题,但是主题修改后会影响整个应用的主题,所以建议使用第二种方法。

       第二种解决方法为:修改布局或通过代码修改。但是要求是必须支持的最小版本是API11。

       修改布局的方法:只需要加上一句android:calendarViewShown="false",即可。

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity" >

    <DatePicker
        android:id="@+id/datePicker"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:calendarViewShown="false" />

</RelativeLayout>

      

  通过代码修改:datePicker.setCalendarViewShown(false);

public class MainActivity extends Activity {

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		DatePicker datePicker = (DatePicker) (findViewById(R.id.datePicker));
		datePicker.setCalendarViewShown(false);
	}
}


   最后呈现上最后的效果图,是不是很满意!

        

   

深度阅读:

setCalendarViewShown

  那么setCalendarViewShown()这个方法的意思是什么?

  意思是:

                      

   1. 【Sets whether the CalendarView is shown】否显示CalendarView控件。

       备注:CalendarView是在API11之后才出现的日历控件。

   2. 【Note: Calling this method has no effect when the DatePicker_datePickerMode attribute is set to             calendar.】当calendar被DatePicker_datePickerMode属性设置的时候,调用这个方法是无效的。

   3. 【shown  true to show the calendar view,false to hide it】当shown为true时显示日历控件,当shown为false时隐藏日历控件。

源码深度学习:

  DatePicker控件定义源码:

  private static final int MODE_SPINNER = 1; 
  private static final int MODE_CALENDAR = 2; ①

  private final DatePickerDelegate mDelegate;
public DatePicker(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
        super(context, attrs, defStyleAttr, defStyleRes);
        final TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.DatePicker,
                defStyleAttr, defStyleRes);
        final int mode = a.getInt(R.styleable.DatePicker_datePickerMode, MODE_SPINNER); ②
        final int firstDayOfWeek = a.getInt(R.styleable.DatePicker_firstDayOfWeek, 0);
        a.recycle();

        switch (mode) {
            case MODE_CALENDAR:③
                mDelegate = createCalendarUIDelegate(context, attrs, defStyleAttr, defStyleRes);
                break;
            case MODE_SPINNER:④
            default:
                mDelegate = createSpinnerUIDelegate(context, attrs, defStyleAttr, defStyleRes);
                break;
        }

        if (firstDayOfWeek != 0) {
            setFirstDayOfWeek(firstDayOfWeek);
        }
    }

      从源码可以看出DatePicke有两种风格:①MODE_CALENDAR和MODE_SPINNER,②如果不设置风格的话,默认风格为MODE_SPINNER风格。③如果是MODE_CALENDAR风格的画则调用createCalendarUIDelegate方法,④否则调用createSpinnerUIDelegate方法。

创建CalendarUI源码分析:

private DatePickerDelegate createCalendarUIDelegate(Context context, AttributeSet attrs,
            int defStyleAttr, int defStyleRes) {
        return new DatePickerCalendarDelegate(this, context, attrs, defStyleAttr,
                defStyleRes);
}

创建SpinnerUI源码分析:

  private DatePickerDelegate createSpinnerUIDelegate(Context context, AttributeSet attrs,
            int defStyleAttr, int defStyleRes) {
        return new DatePickerSpinnerDelegate(this, context, attrs, defStyleAttr, defStyleRes);
  }

 

final TypedArray attributesArray = context.obtainStyledAttributes(attrs,
                    R.styleable.DatePicker, defStyleAttr, defStyleRes);
boolean spinnersShown = attributesArray.getBoolean(R.styleable.DatePicker_spinnersShown,
                    DEFAULT_SPINNERS_SHOWN);
boolean calendarViewShown = attributesArray.getBoolean(
                    R.styleable.DatePicker_calendarViewShown, DEFAULT_CALENDAR_VIEW_SHOWN);
int startYear = attributesArray.getInt(R.styleable.DatePicker_startYear,DEFAULT_START_YEAR);
int endYear = attributesArray.getInt(R.styleable.DatePicker_endYear, DEFAULT_END_YEAR);
String minDate = attributesArray.getString(R.styleable.DatePicker_minDate);
String maxDate = attributesArray.getString(R.styleable.DatePicker_maxDate);
int layoutResourceId = attributesArray.getResourceId(
                    R.styleable.DatePicker_legacyLayout, R.layout.date_picker_legacy);
attributesArray.recycle();

    通过源码可以看出,默认spinner和calendarView都是显示的。

  DatePicker的属性定义源码:

<declare-styleable name="DatePicker">
        <!-- The first year (inclusive), for example "1940".
             {@deprecated Use minDate instead.} -->
        <attr name="startYear" format="integer" />
        <!-- The last year (inclusive), for example "2010".
             {@deprecated Use maxDate instead.} -->
        <attr name="endYear" format="integer" />
        <!-- Whether the spinners are shown. -->
        <attr name="spinnersShown" format="boolean" />
        <!-- Whether the calendar view is shown. -->
        <attr name="calendarViewShown" format="boolean" />
        <!-- The minimal date shown by this calendar view in mm/dd/yyyy format. -->
        <attr name="minDate" format="string" />
        <!-- The maximal date shown by this calendar view in mm/dd/yyyy format. -->
        <attr name="maxDate" format="string" />
        <!-- The first day of week according to {@link java.util.Calendar}. -->
        <attr name="firstDayOfWeek" />
        <!-- @hide The layout of the date picker. -->
        <attr name="internalLayout" format="reference"  />
        <!-- @hide The layout of the legacy DatePicker. -->
        <attr name="legacyLayout" />
        <!-- The background color for the date selector 's day of week. -->
        <attr name="dayOfWeekBackground" format="color|reference" />
        <!-- The text color for the date selector's day of week. -->
        <attr name="dayOfWeekTextAppearance" format="reference" />
        <!-- The month's text appearance in the date selector. -->
        <attr name="headerMonthTextAppearance" format="reference" />
        <!-- The day of month's text appearance in the date selector. -->
        <attr name="headerDayOfMonthTextAppearance" format="reference" />
        <!-- The year's text appearance in the date selector. -->
        <attr name="headerYearTextAppearance" format="reference" />
        <!-- The background for the date selector. -->
        <attr name="headerBackground" />
        <!-- @hide The selected text color for the date selector. Used as a
             backup if the text appearance does not explicitly have a color
             set for the selected state. -->
        <attr name="headerSelectedTextColor" />
        <!-- The list year's text appearance in the list. -->
        <attr name="yearListItemTextAppearance" format="reference" />
        <!-- The list year's selected circle color in the list. -->
        <attr name="yearListSelectorColor" format="color" />
        <!-- The text color list of the calendar. -->
        <attr name="calendarTextColor" format="color" />
        <!-- @hide The selected text color for the calendar. Used as a backup
             if the text color does not explicitly have a color set for the
             selected state. -->
        <attr name="calendarSelectedTextColor" format="color" />
        <!-- Defines the look of the widget. Prior to the L release, the only choice was
             spinner. As of L, with the Material theme selected, the default layout is calendar,
             but this attribute can be used to force spinner to be used instead. -->
        <attr name="datePickerMode">
            <!-- Date picker with spinner controls to select the date. -->
            <enum name="spinner" value="1" />
            <!-- Date picker with calendar to select the date. -->
            <enum name="calendar" value="2" />
        </attr>
</declare-styleable>


同样的查看源码还有以下方法:

        @Override
        public CalendarView getCalendarView() {
            return mCalendarView;
        }

        @Override
        public void setCalendarViewShown(boolean shown) {
            mCalendarView.setVisibility(shown ? VISIBLE : GONE);
        }

        @Override
        public boolean getCalendarViewShown() {
            return (mCalendarView.getVisibility() == View.VISIBLE);
        }

        @Override
        public void setSpinnersShown(boolean shown) {
            mSpinners.setVisibility(shown ? VISIBLE : GONE);
        }

        @Override
        public boolean getSpinnersShown() {
            return mSpinners.isShown();
        }

   




   

© 著作权归作者所有

共有 人打赏支持
崔同亮
粉丝 19
博文 89
码字总数 36614
作品 0
海淀
程序员
JQuery datepicker 使用方法

DatePicker基本使用方法: <!DOCTYPE html><html><head> <link href="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8/themes/base/jquery-ui.css" rel="stylesheet" type="text/css"/> ......

伯洛芒果汁。
2013/03/10
0
0
简述UIDatePicker的用法

1.Locale 设置DatePicker的地区,即设置DatePicker显示的语言。 1.跟踪所有可用的地区,取出想要的地区 NSLog(@"%@", [NSLocale availableLocaleIdentifiers]); 2. 设置日期选择控件的地区 [d...

mahb520
2014/10/13
0
0
Jquery Dialog DatePicker 控件使用问题

场景: 项目中使用Jquery的DataPicker作为我们的时间控件。有个页面需要在Dialog中使用DatePicker时间控件。 问题: Jquery的DatePicker时间控件显示总是在Dialog层之下。 解决: 找到jquer...

保罗的寓言
2012/03/19
0
0
Cloning JQuery UI datepicker

In case you were having problems with cloning fields with jQuery UI datepicker attached to them - solutions mentioned in the interwebs are similar to this one: However, that did......

William
2012/03/02
0
1
Objective-c 手写UIDatePicker

// // ViewController.m // 手写UIDatePicker // // Created by 非凡 程序员 on 15/11/13. // Copyright (c) 2015年 非凡 程序员. All rights reserved. // .h文件 #import <UIKit/UIKit.h> ......

xtzPioneer
2015/11/13
0
0
解决 jQuery UI Datepicker 无法弹出日期的问题

今天遇到一个意想不到的bug,在使用jQuery UI Datepicker 时无法弹出日期选择框。 经过和官方的演示案例对比,最终找到了问题所在。 我使用的错误方法: <input type="text" id="to" name="t...

轻松筹社长
2014/03/31
0
0
[非凡程序员]手写UIDatePicker和UIPickerView

// // ViewController.h // 手写UIDatePicker // // Created by 非凡 程序员 on 15/11/13. // Copyright (c) 2015年 非凡 程序员. All rights reserved. // #import <UIKit/UIKit.h> @interf......

温暖c
2015/11/13
0
0
手写UIDatePicker和UIPickerView

// // ViewController.h // 手写UIDatePicker // // Created by 非凡 程序员 on 15/11/13. // Copyright (c) 2015年 非凡 程序员. All rights reserved. // #import <UIKit/UIKit.h> @interf......

温暖c
2015/11/13
0
0
关于在datepicker中,只选年月

有这么个需求,datepicker默认是选某个具体的日子的,但是现在只选到年月为止, solution: html如下: <div> <label for="startDate">Date :</label> <input name="startDate" id="startDat......

程序猿小明
2014/09/28
0
2
UIDatePicker和UIPickerView

UIPickerView UIPickerView控件也是iPhone中比较常用到的一个控件,它通过转界面提供一系列多值选项,它向用户显示信息,也收集用户输入。 UIPickerView里⾯的组件数和组件里的 要使用UIPickerV...

温暖c
2015/11/13
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

CoreText进阶(五)- 文字排版样式和效果

CoreText进阶(五)- 文字排版样式和效果 效果 以下是三个设置了不同属性的效果图 第一个设置了文字颜色为红色,字体为16号 第二个设置了文字颜色为灰色,字体为16号,对其为居中 第三个设置...

aron1992
23分钟前
1
0
10.23 linux任务计划cron~10.27 target介绍

crontab命令被用来提交和管理用户的需要周期性执行的任务,与windows下的计划任务类似,当安装完成操作系统后,默认会安装此服务工具,并且会自动启动crond进程,crond进程每分钟会定期检查是...

洗香香
33分钟前
0
0
告警系统主脚本、告警系统配置文件、告警系统监控项目

20.20 告警系统主脚本 告警系统主脚本 main.sh内容 #!/bin/bash#Written by aming.# 是否发送邮件的开关export send=1# 过滤ip地址export addr=`/sbin/ifconfig |grep -A1 "en...

lyy549745
37分钟前
0
0
Don’t Repeat Yourself

在软件工程中,Don’t Repeat Yourself(DRY)是软件开发的原则,旨在减少重复,用抽象代替它,使用数据规范化来避免冗余。 这个原则在维基百科上是说是由Andy Hunt和Dave Thomas《The Pragmat...

woshixin
39分钟前
0
0
搭建webpack项目框架

作者:汪娇娇 时间:2018年6月4日 一、说明 随着业务发展和前端人员的增加,搭建一个通用框架以及制定统一规范就成了必然。对于选型这方面,一开始好像就没考虑其他框架,直接选了webpack。w...

娇娇jojojo
46分钟前
0
0
Java基础——面向对象(内部类)

声明:本栏目所使用的素材都是凯哥学堂VIP学员所写,学员有权匿名,对文章有最终解释权;凯哥学堂旨在促进VIP学员互相学习的基础上公开笔记。 内部类: 1.有名内部类 2.无名内部类 内部类申请...

凯哥学堂
54分钟前
0
0
HttpClient内部三个超时时间的区别

RequestConfig requestConfig = RequestConfig.custom() .setConnectionRequestTimeout(config.connReqTimeout) //从连接池中获取连接的超时时间 ......

1713716445
今天
0
0
每天一个命令SCP

每天一个命令:SCP scp是secure copy的简写,用于在Linux下进行远程拷贝文件的命令,和它类似的命令有cp,不过cp只是在本机进行拷贝不能跨服务器,而且scp传输是加密的。可能会稍微影响一下速...

河图再现
今天
0
0
cron/chkconfig/systemd/unit/target

linux任务计划 : cron工具 任务计划在运维工作中用到的比较多,大部分系统管理工作都是通过定期自动执行某个脚本来完成。 查看linux中任务计划的配置文件: /etc/crontab [root@yolks-001 ~]...

Hi_Yolks
今天
1
0
ftp攻略

Vsftpd完全攻略(一)ftp原理与vsftp安装:https://www.iyunv.com/thread-44698-1-1.html Vsftpd完全攻略(二)设置匿名用户也支持下载和上传与创建目录:https://www.iyunv.com/forum.php?mo...

寰宇01
今天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部