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. 牛客练习赛64 D【容斥+背包】

    牛客练习赛64 D.宝石装箱 Description \(n\)颗宝石装进\(n\)个箱子使得每个箱子中都有一颗宝石.第\(i\)颗宝石不能装入第\(a_i\)个箱子.求合法的装箱方案对\(99824 ...

  2. Codeforces Round #345 (Div. 1) C. Table Compression (并查集)

    Little Petya is now fond of data compression algorithms. He has already studied gz, bz, zip algorith ...

  3. tju3243 Blocked Road

    There are N seaside villages on X island, numbered from 1 to N. N roads are built to connect all of ...

  4. C#线程Thread类

    在System.Threading 命名空间下,包含了用于创建和控制线程的Thread 类.对线程的常用操作有:启动线程.终止线程.合并线程和让线程休眠等. 1 启动线程 在使用线程前,首先要创建一个 ...

  5. Open3d之交互式可视化

    本篇教程介绍了Open3D的可视化窗口的交互功能. # -*- coding:utf-8 -*- import copy import numpy as np import open3d as o3d ...

  6. 基于用户的协同过滤的电影推荐算法(tensorflow)

    数据集: https://grouplens.org/datasets/movielens/ ml-latest-small 协同过滤算法理论基础 https://blog.csdn.net/u012 ...

  7. HDU 4335 What is N?(指数循环节)题解

    题意: 询问有多少数\(n\)满足\(n^{n!}\equiv b\mod p \land\ n\in[1,M]\),数据范围:\(M\leq2^{64}-1,p\leq1e5\) 思路: 这题显然要 ...

  8. IDEA 安装常用操作一

    关于IDEA的下载,破解自行百度 一.安装完成的常用设置 SDK选择.编译版本的选择,单项目选择,全局选择 maven配置,单项目,全局配置 二.IDEA如何安装lombok https://www. ...

  9. 记一次 Billu_b0x渗透

    目录: 0x01 寻找ip 1.这边我们是使用的nmap来寻找我们的靶机IP地址,开始Ip是1,结束是254,153是我kali的ip,所以158就是我们的靶机的ip地址了. 2. 查看端口服务 这边 ...

  10. MYSQL基础常见常用语句200条

    数据库 # 查看所有的数据库 SHOW DATABASES ; # 创建一个数据库 CREATE DATABASE k; # 删除一个数据库 DROP DATABASE k; # 使用这个数据库 US ...