文档章节

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

崔同亮
 崔同亮
发布于 2016/03/02 15:04
字数 1155
阅读 390
收藏 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
海淀
程序员
私信 提问
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
iOS与Android平台上问题列表

问题列表 伪类 :active 生效 要CSS伪类 生效,只需要给 document 绑定 或 事件 消除 transition 闪屏 两个方法 消除 IE10 里面的那个叉号 来源出处:http://msdn.microsoft.com/en-us/libra...

陈文亮
2015/03/01
6
0
WPF 4 日期选择器(DatePicker)

前一篇 《WPF 4 日历控件(Calendar)》 中我们对日历控件的使用方式有了基本了解,本篇将继续介绍WPF 4 中另一个新控件“日期选择器”(DatePicker)。与Calendar 相比DatePicker 多出了一个...

junwong
2012/03/09
3.7K
0
在Bootstrap开发框架中使用bootstrap-datepicker插件

在基于Boostrap的Web开发中,往往需要录入日期内容,基于Boostrap的插件中,关于日期的录入可以使用bootstrap-datepicker这个非常不错的插件,以替代默认的type=date这种不太友好的日期录入控...

伍华聪
2018/10/22
0
0

没有更多内容

加载失败,请刷新页面

加载更多

OSChina 周一乱弹 —— 白掌柜说了卖货不卖身

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @爱漫爱 :这是一场修行分享羽肿的单曲《Moony》 手机党少年们想听歌,请使劲儿戳(这里) @clouddyy :开不开心? 开心呀, 我又不爱睡懒觉…...

小小编辑
今天
7
0
大数据教程(11.7)hadoop2.9.1平台上仓库工具hive1.2.2搭建

上一篇文章介绍了hive2.3.4的搭建,然而这个版本已经不能稳定的支持mapreduce程序。本篇博主将分享hive1.2.2工具搭建全过程。先说明:本节就直接在上一节的hadoop环境中搭建了! 一、下载apa...

em_aaron
今天
2
0
开始看《JSP&Servlet学习笔记》

1:WEB应用简介。其中1.2.1对Web容器的工作流程写得不错 2:编写Servlet。搞清楚了Java的Web目录结构,以及Web.xml的一些配置作用。特别是讲了@WebServlet标签 3:请求与响应。更细致的讲了从...

max佩恩
今天
4
0
mysql分区功能详细介绍,以及实例

一,什么是数据库分区 前段时间写过一篇关于mysql分表的的文章,下面来说一下什么是数据库分区,以mysql为例。mysql数据库中的数据是以文件的形势存在磁盘上的,默认放在/mysql/data下面(可...

吴伟祥
今天
3
0
SQL语句查询

1.1 排序 通过order by语句,可以将查询出的结果进行排序。放置在select语句的最后。 格式: SELECT * FROM 表名 ORDER BY 排序字段ASC|DESC; ASC 升序 (默认) DESC 降序 1.查询所有商品信息,...

stars永恒
今天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部