android中DatePickerDialog只显示年月
来源:互联网 发布:怎么可以做淘宝模特 编辑:程序博客网 时间:2024/06/06 12:50
今天项目中碰到一个需求,就是在填信用卡的时候,需要填信用卡的有效期(包括年月,没有日),但是正常的日期选择器都是有日的。。。。另外项目中希望弹出个dialog来显示日期选择器,所以这里采用DatePickerDialog。
实现的效果是:无论在什么语言的系统下,都只显示年月,并且月在前,年在后(在英文的系统中,是mmddyy的顺序,但是在中文系统中是yymmdd的顺序)
看下代码:
final Calendar calendar = Calendar.getInstance(); int yy = calendar.get(Calendar.YEAR); int mm = calendar.get(Calendar.MONTH); int dd = calendar.get(Calendar.DAY_OF_MONTH); DatePickerDialog dlg = new DatePickerDialog(new ContextThemeWrapper(getActivity(), android.R.style.Theme_Holo_Light_Dialog_NoActionBar), null, yy, mm, dd) { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); LinearLayout mSpinners = (LinearLayout) findViewById(getContext().getResources().getIdentifier("android:id/pickers", null, null)); if (mSpinners != null) { NumberPicker mMonthSpinner = (NumberPicker) findViewById(getContext().getResources().getIdentifier("android:id/month", null, null)); NumberPicker mYearSpinner = (NumberPicker) findViewById(getContext().getResources().getIdentifier("android:id/year", null, null)); mSpinners.removeAllViews(); if (mMonthSpinner != null) { mSpinners.addView(mMonthSpinner); } if (mYearSpinner != null) { mSpinners.addView(mYearSpinner); } } View dayPickerView = findViewById(getContext().getResources().getIdentifier("android:id/day", null, null)); if(dayPickerView != null){ dayPickerView.setVisibility(View.GONE); } } @Override public void onDateChanged(DatePicker view, int year, int month, int day) { super.onDateChanged(view, year, month, day); setTitle("请选择信用卡有效期"); } }; dlg.setTitle("请选择信用卡有效期");
运行上述代码的效果是这样的:
怎么样,是不是好看了很多?效果的变化来源于在声明DatePickerDialog的时候,传了一个主题theme给它:
new ContextThemeWrapper(getActivity(),android.R.style.Theme_Holo_Light_Dialog_NoActionBar)
如果没有传入style的话,长这个样子:
现在再来看看,是如何做到隐藏日的选择器,只显示年和月的,并且让月显示在年前面的。
在DatePickerDialog中,也是有一个DatePicker的,现在来看下DatePicker的代码,我找到了他引用的layout资源:
打开该资源文件:
<?xml version="1.0" encoding="utf-8"?><!--**** Copyright 2007, The Android Open Source Project**** Licensed under the Apache License, Version 2.0 (the "License");** you may not use this file except in compliance with the License.** You may obtain a copy of the License at**** http://www.apache.org/licenses/LICENSE-2.0**** Unless required by applicable law or agreed to in writing, software** distributed under the License is distributed on an "AS IS" BASIS,** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.** See the License for the specific language governing permissions and** limitations under the License.*/--><!-- Layout of date picker--><!-- Warning: everything within the "pickers" layout is removed and re-ordered depending on the date format selected by the user.--><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_gravity="center_horizontal" android:orientation="horizontal" android:gravity="center"> <LinearLayout android:id="@+id/pickers" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1" android:orientation="horizontal" android:gravity="center"> <!-- Month --> <NumberPicker android:id="@+id/month" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginStart="1dip" android:layout_marginEnd="1dip" android:focusable="true" android:focusableInTouchMode="true" /> <!-- Day --> <NumberPicker android:id="@+id/day" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginStart="1dip" android:layout_marginEnd="1dip" android:focusable="true" android:focusableInTouchMode="true" /> <!-- Year --> <NumberPicker android:id="@+id/year" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginStart="1dip" android:layout_marginEnd="1dip" android:focusable="true" android:focusableInTouchMode="true" /> </LinearLayout> <!-- calendar view --> <CalendarView android:id="@+id/calendar_view" android:layout_width="245dip" android:layout_height="280dip" android:layout_marginStart="44dip" android:layout_weight="1" android:focusable="true" android:focusableInTouchMode="true" android:visibility="gone" /></LinearLayout>preview的效果是:
看到了吧,其实内部是三个NumberPicker,外部的布局是LinearLayout,横向排列。那我在想隐藏日的选择器很简单,直接获取该view,然后设置为gone就好了。(看上面的代码你就懂了,这里不说明了)
但是再一看代码,发现该layout原来的顺序就是month-day-year,那为什么中文系统中会修改顺序呢?继续找代码!
往下翻找,找到了一个reorderSpinner的方法,原来就是这段代码,根据当前系统的语言,来重排序了!
/** * Reorders the spinners according to the date format that is * explicitly set by the user and if no such is set fall back * to the current locale's default format. */ private void reorderSpinners() { mSpinners.removeAllViews(); // We use numeric spinners for year and day, but textual months. Ask icu4c what // order the user's locale uses for that combination. http://b/7207103. String pattern = DateFormat.getBestDateTimePattern(Locale.getDefault(), "yyyyMMMdd"); char[] order = ICU.getDateFormatOrder(pattern); final int spinnerCount = order.length; for (int i = 0; i < spinnerCount; i++) { switch (order[i]) { case 'd': mSpinners.addView(mDaySpinner); setImeOptions(mDaySpinner, spinnerCount, i); break; case 'M': mSpinners.addView(mMonthSpinner); setImeOptions(mMonthSpinner, spinnerCount, i); break; case 'y': mSpinners.addView(mYearSpinner); setImeOptions(mYearSpinner, spinnerCount, i); break; default: throw new IllegalArgumentException(Arrays.toString(order)); } } }看完这段代码,我就大概知道怎么重排年和月了,看最上面我提供的实现代码,你就应该知道了,不再赘述了。
- android中DatePickerDialog只显示年月
- Android DatePickerDialog 只显示年月
- Android DatePickerDialog 只显示年月
- Android DatePickerDialog 只显示年月
- Android DatePickerDialog 只显示年月
- Android DatePickerDialog 只显示年月
- Android的DatePickerDialog只显示年月
- android 修改DatePickerDialog只显示“年月”,去掉“日”显示
- Android日历选择控件DatePickerDialog只显示年月
- DatePickerDialog用法及只显示年月隐藏日
- Android中DatePicker只显示年月的方法
- Android 日期控件只显示年月
- Android日历只显示年月,只显示年
- easyui只显示年月
- datepicker只显示年月
- Android 只有年月没有日的datepickerdialog
- Android只显示月和日的DatePickerDialog
- [Android]只显示月和日的DatePickerDialog
- 跟我一起写 Makefile(五)
- 复选框的全选
- 【第六章】 AOP 之 6.3 基于Schema的AOP ——跟我学spring3
- 跟我一起写 Makefile(六)
- Python 对图片进行人脸识别
- android中DatePickerDialog只显示年月
- Egret)Demo - eui state自定义状态的使用
- 佰草集CRM服务端优化经验——致曾经的小白(一)
- iOS高德定位和自带逆地理编码进行坐标转换
- 好的软件架构设计
- jquery的animate设置样式overflow:hidden的解决方法
- Andriod之SHA-256,MD5加密字符串
- C++ 编写一个选课系统
- 应用内文件预览