DatePickerDemoForAndroid24

解决 DatePickerDialog 在 Android7.0 API24 上使用AlertDialog.THEME_TRADITIONALAlertDialog.THEME_HOLO_DARKAlertDialog.THEME_HOLO_LIGHT等样式时无法显示为 Spinner 样式的问题。


完整项目与演示地址

Github

API24 无法显示 Spinner 样式

在设备 API24 时,调用DatePickerDialog来选择日期和时间时,如果指定的主题为THEME_TRADITIONALTHEME_HOLO_DARKTHEME_HOLO_LIGHT,会出现和其他 API Level 不一样的对话框。

  • THEME_TRADITIONAL

  • THEME_HOLO_DARK

  • THEME_HOLO_LIGHT

解决方式

Build.VERSION.SDK_INT == 24时做特殊处理,传入对应 theme 的 ContextThemeWrapper,使用 DatePickerDialogForAndroid24 来展示 Spinner 样式的 DatePickerDialog。

    /**
* Api24下显示Spinner样式的Dialog
* @param theme ContextThemeWrapper的theme与DialogTheme的对应关系如下
* android.R.style.Theme_Dialog -> AlertDialog.THEME_TRADITIONAL
* android.R.style.Theme_Holo -> AlertDialog.THEME_HOLO_DARK
* android.R.style.Theme_Holo_Light -> AlertDialog.THEME_HOLO_LIGHT
*/
private fun showDatePickerDialogApi24(theme: Int) {
val themeContext =
ContextThemeWrapper(this@MainActivity, theme)
try {
val dialog = DatePickerDialogForAndroid24(
themeContext,
null,
Calendar.getInstance().get(Calendar.YEAR),
Calendar.getInstance().get(Calendar.MONTH),
Calendar.getInstance().get(Calendar.DAY_OF_MONTH)
)
dialog.create()
dialog.getButton(DialogInterface.BUTTON_NEGATIVE).visibility = View.GONE
dialog.show()
} catch (e: Exception) {
showAlertDialog(e.toString())
e.printStackTrace()
}
}
class DatePickerDialogForAndroid24(
context: Context,
listener: OnDateSetListener?,
year: Int,
monthOfYear: Int,
dayOfMonth: Int
) : DatePickerDialog(context, listener, year, monthOfYear, dayOfMonth) { init {
if (Build.VERSION.SDK_INT == 24) {
try {
val field = findField(
DatePickerDialog::class.java,
DatePicker::class.java,
"mDatePicker"
)
val datePicker = field.get(this) as DatePicker
val delegateClass =
Class.forName("android.widget.DatePicker\$DatePickerDelegate")
val delegateField = findField(DatePicker::class.java, delegateClass, "mDelegate") val delegate = delegateField.get(datePicker)
val spinnerDelegateClass = Class.forName("android.widget.DatePickerSpinnerDelegate") if (delegate.javaClass != spinnerDelegateClass) {
delegateField.set(datePicker, null)
datePicker.removeAllViews() val spinnerDelegateConstructor = spinnerDelegateClass.getDeclaredConstructor(
DatePicker::class.java,
Context::class.java,
AttributeSet::class.java,
Int::class.java,
Int::class.java
)
spinnerDelegateConstructor.isAccessible = true
val spinnerDelegate = spinnerDelegateConstructor.newInstance(
datePicker,
context,
null,
android.R.attr.datePickerStyle,
0
)
delegateField.set(datePicker, spinnerDelegate) datePicker.init(year, monthOfYear, dayOfMonth, this)
datePicker.calendarViewShown = false
datePicker.spinnersShown = true
}
} catch (e: Exception) {
e.printStackTrace()
}
}
else{
throw Exception("Not Android 7.0 Device")
}
}
}

完整演示

  • API24

  • API30

解决 DatePickerDialog 在 Android7.0 API24 上使用 AlertDialog.THEME_TRADITIONAL、AlertDialog.THEME_HOLO_DARK、AlertDialog.THEME_HOLO_LIGHT等样式时无法显示为 Spinner 样式的问题的更多相关文章

  1. [问题解决]Android7.0上PopupWindow的showAsDropDown位置问题

    [问题解决]Android7.0上PopupWindow的showAsDropDown位置问题 /** * Created by diql on 2017/02/16. */ 问题说明 我的popup ...

  2. 【转】Android7.0适配心得

    本文出自:贾鹏辉的技术博客(http://www.devio.org) http://www.devio.org/2016/09/28/Android7.0%E9%80%82%E9%85%8D%E5% ...

  3. Android7.0新特性,及Android N适配

    新特性部分 Android 7.0 Nougat 提供新功能以提升性能.生产效率和安全性,主要新增了下面的新特性和优化: 一.新的Notification Android N 添加了很多新的notif ...

  4. Android7.0 Phone应用源码分析(二) phone来电流程分析

    接上篇博文:Android7.0 Phone应用源码分析(一) phone拨号流程分析 今天我们再来分析下Android7.0 的phone的来电流程 1.1TelephonyFramework 当有 ...

  5. appium在android7.0上无法启动问题

    前言 由于最近很多android手机升级到7.0系统了,有些小伙伴的appium版本用的还是1.4版本,在运行android7.0的app自动化时候遇到无法启动问题:WebDriverExceptio ...

  6. 安装win8/win10提示无法在驱动器0分区上安装windows解决方法

    在通过U盘或光盘安装win8/win8.1/win10系统时,不少用户遇到无法安装的问题,提示“无法在驱动器0的分区1上安装windows”,格式化分区1也不能解决,进而提示Windows无法安装到这 ...

  7. Android 升级安装APK兼容Android7.0,解决FileUriExposedException

    我们在开发app时避免不了需要添加应用内升级功能.当app启动时,如果检测到最新版本,将apk安装包从服务器下载下来,执行安装.安装apk的代码一般写法如下,网上随处可以搜到 public stati ...

  8. fir.im Weekly - 关于 Log Guru 开源、Xcode 探索和 Android7.0 适配

    本期 fir.im Weekly 整理了最近的一些技术分享,包括关于 Log Guru 开源.Xcode 探索. Android7.0 适配等等 iOS/Android 相关的工具.源码分享和技术文章 ...

  9. 拍照、本地图片工具类(兼容至Android7.0)

    拍照.本地图片工具类:解决了4.4以上剪裁会提示"找不到文件"和6.0动态授予权限,及7.0报FileUriExposedException异常问题. package com.hb ...

随机推荐

  1. HDU6331 Problem M. Walking Plan【Floyd + 矩阵 + 分块】

    HDU6331 Problem M. Walking Plan 题意: 给出一张有\(N\)个点的有向图,有\(q\)次询问,每次询问从\(s\)到\(t\)且最少走\(k\)条边的最短路径是多少 \ ...

  2. 【noi 2.6_1808】最长公共子序列(DP)

    题意:给2个字符串求其最大公共子序列的长度.解法:这个和一般的状态定义有点不一样,f[i][j]表示 str 前i位和 str2 前j的最大公共子序列的长度,而不是选 str 的第i位和 str2 的 ...

  3. Codeforces Round #645 (Div. 2) C. Celex Update

    题目链接:C.Celex Update 题意: 给你如图所示的图形,问从(x1,y1)−>(x2,y2)路径上的不同的元素和的数量是多少. 题解: 从(1,1)到(3,3) 元素和的1−2−4− ...

  4. hdu3564 Another LIS

    Problem Description There is a sequence firstly empty. We begin to add number from 1 to N to the seq ...

  5. 洛谷P1119-灾后重建-floyd算法

    洛谷P1119-灾后重建 题目描述 给出\(B\)地区的村庄数NN,村庄编号从\(0\)到\(N-1\),和所有\(M\)条公路的长度,公路是双向的. 给出第\(i\)个村庄重建完成的时间\(t_i\ ...

  6. 爬虫入门三 scrapy

    title: 爬虫入门三 scrapy date: 2020-03-14 14:49:00 categories: python tags: crawler scrapy框架入门 1 scrapy简介 ...

  7. ES-Next @Decorator All In One

    ES-Next @Decorator All In One @装饰器 import { logged } from "./logged.mjs"; class C { @logge ...

  8. ES6 arrow function vs ES5 function

    ES6 arrow function vs ES5 function ES6 arrow function 与 ES5 function 区别 this refs xgqfrms 2012-2020 ...

  9. css skeleton loading & skeleton components

    css skeleton loading css & :empty See the Pen Skeleton Screen with CSS by xgqfrms (@xgqfrms) on ...

  10. flex & flex-wrap

    flex & flex-wrap https://css-tricks.com/almanac/properties/f/flex-wrap/ https://developer.mozill ...