文档章节

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

崔同亮
 崔同亮
发布于 2016/03/02 15:04
字数 1155
阅读 1.1K
收藏 1

「深度学习福利」大神带你进阶工程师,立即查看>>>

        在学习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();
        }

   




   

崔同亮
粉丝 20
博文 89
码字总数 36614
作品 0
海淀
程序员
私信 提问
加载中
请先登录后再评论。
用vertx实现高吞吐量的站点计数器

工具:vertx,redis,mongodb,log4j 源代码地址:https://github.com/jianglibo/visitrank 先看架构图: 如果你不熟悉vertx,请先google一下。我这里将vertx当作一个容器,上面所有的圆圈要...

jianglibo
2014/04/03
4.3K
3
我的架构演化笔记 功能1: 基本的用户注册

“咚咚”,一阵急促的敲门声, 我从睡梦中惊醒,我靠,这才几点,谁这么早, 开门一看,原来我的小表弟放暑假了,来南京玩,顺便说跟我后面学习一个网站是怎么做出来的。 于是有了下面的一段...

强子哥哥
2014/05/31
976
3
beego API开发以及自动化文档

beego API开发以及自动化文档 beego1.3版本已经在上个星期发布了,但是还是有很多人不了解如何来进行开发,也是在一步一步的测试中开发,期间QQ群里面很多人都问我如何开发,我的业余时间实在...

astaxie
2014/06/25
2.7W
22
Nutch学习笔记4-Nutch 1.7 的 索引篇 ElasticSearch

上一篇讲解了爬取和分析的流程,很重要的收获就是: 解析过程中,会根据页面的ContentType获得一系列的注册解析器, 依次调用每个解析器,当其中一个解析成功后就返回,否则继续执行下一个解...

强子哥哥
2014/06/26
712
0
程序猿媛一:Android滑动翻页+区域点击事件

滑动翻页+区域点击事件 ViewPager+GrideView 声明:博文为原创,文章内容为,效果展示,思路阐述,及代码片段。文尾附注源码获取途径。 转载请保留原文出处“http://my.oschina.net/gluoyer...

花佟林雨月
2013/11/09
4.3K
1

没有更多内容

加载失败,请刷新页面

加载更多

EasyDL入驻社区果蔬店 离线识别秒级智能结算

传统收银方式高成本低效率 急需转型 500米商圈概念被越来越多的企业关注,在中国,一个社区就有可能成为一个商圈,蕴藏着巨大的商机。而在社区中,果蔬作为人们每天都要采购的高频消费商品,...

百度智能云
06/10
0
0
rabbitmq集群环境安装配置

一、主机清单 2台机器同时执行下面安装步骤 10.0.0.216 shiguang-rabbitmq-01 10.0.0.223 shiguang-rabbitmq-02 注意:请将上面内容加入2台机器 /etc/hosts (集群环境必须要加) 1、安装erlan...

caozhangming
2019/08/09
0
0
【rabbitmq-Php】-发布Publish 与订阅Subscribe

发布/订阅,使用扇型交换机(fanout) composer.json ### composer.json { "require": { "php-amqplib/php-amqplib": ">=2.9.0" }} 发布端(Publish) /** * rabbitmq......

DEPAKIN
33分钟前
13
0
如何在PHP中进行重定向? - How do I make a redirect in PHP?

问题: Is it possible to redirect a user to a different page through the use of PHP? 是否可以通过使用PHP将用户重定向到其他页面? Say the user goes to www.example.com/page.php an......

法国红酒甜
43分钟前
9
0
一周面试了 30 人,通过 2 人,面试面到我心态爆炸…

Java技术栈 www.javastack.cn 打开网站看更多优质文章 因技术团队人员调整及项目组扩编,需要招几个 Java 程序员,3~5年左右,领导要求的是能力要比现有的大部分技术人员要强,并且宁缺勿滥...

Java技术栈
05/24
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部