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. Codeforces Round #664 (Div. 2) C. Boboniu and Bit Operations

    传送门:cf1395C 题意 c[i]=a[i]&b[j],b[j]是b数组中任意一个,求c[1] | c[2] | ... | c[n]最小值. 题解 经典的二进制枚举答案,因为a和b的最大 ...

  2. Luogu T9376 区间GCD

    题目背景 无 题目描述 给定一长度为n的动态序列,请编写一种数据结构,要求支持m次操作,包括查询序列中一闭区间中所有数的GCD,与对一闭区间中所有数加上或减去一个值. 输入输出格式 输入格式: 第1行 ...

  3. hdu5497 Inversion

    Problem Description You have a sequence {a1,a2,...,an} and you can delete a contiguous subsequence o ...

  4. nuoyanli 520 Let‘s play computer game

    H题 描述 xxxxxxxxx在疫情期间迷上了一款游戏,这个游戏一共有nnn个地点(编号为1--n1--n1--n),他每次从一个地点移动到另外一个地点需要消耗 一定的能量,每一个地点都有一些珠宝,输 ...

  5. SQL Server 新安装启用sa用户/sa用户登录提示管道另一端无进程

    安装时只用windows验证 安装完成后: 首先选中服务器(右键)->属性->安全性->服务器身份验证修改为"SQL SERVER和WINDOWS身份验证模式"其 ...

  6. Nginx 服务介绍

    目录 静态 / 动态 Web 服务 Nginx 简介 Nginx 的优点 Nginx 和 Apache 的比较 Nginx 的安装 Nginx 相关文件 Nginx 主配置文件 Nginx 虚拟主机配 ...

  7. K8S(04)核心插件-coredns服务

    K8S核心插件-coredns服务 目录 K8S核心插件-coredns服务 1 coredns用途 1.1 为什么需要服务发现 2 coredns的部署 2.1 获取coredns的docker镜像 ...

  8. 关于HashMap遍历,为什么要用entry

    Map.entrySet() 这个方法返回的是一个Set<Map.Entry<K,V>>,Map.Entry 是Map中的一个接口,他的用途是表示一个映射项(里面有Key和Va ...

  9. vue2 响应式细节

    data 中的数据是如何处理的? 每一次实例化一个组件,都会调用 initData 然后调用 observe 方法,observe 方法调用了 new Observer(value), 并且返回 __ ...

  10. 基于HSV彩色空间与直方图信息的植物叶脉FFCM算法提取

    宣旭峰,王美丽,张建锋. 基于HSV彩色空间与直方图信息的植物叶脉FFCM算法提取[J/OL]. 计算机应用研究,2018,(08):1-7. (2017-07-21)[2017-10-09]. ht ...