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. BZOJ2882 工艺【SAM】 最小循环串

    BZOJ2882 工艺 给出一个串,要求其循环同构串中字典序最小的那个 串翻倍建\(SAM\)然后从起点开始贪心的跑\(n\)次即可 当然也能用最小表示法来做 #include<bits/std ...

  2. Codeforces Round #648 (Div. 2) D. Solve The Maze

    这题犯了一个很严重的错误,bfs 应该在入队操作的同时标记访问,而不是每次只标记取出的队首元素. 题目链接:https://codeforces.com/contest/1365/problem/D ...

  3. Java——方法及构造方法、intellij IDEA中的一些快捷键

    intellij IDEA中的一些快捷键: 一.方法基础 给你一个两个int类型的数相加的例子: 这个例子说明了 public static void main(String[] args) {}相当 ...

  4. 3.keepalived+脚本实现nginx高可用

    标题 : 3.keepalived+脚本实现nginx高可用 目录 : Nginx 序号 : 3 else exit 0 fi else exit 0 fi - 需要保证脚本有执行权限,可以使用chm ...

  5. VMware虚拟化与Kubernetes(K8s)类比阐述-适合VMware用户

    概述 容器技术是最近几年非常热门的技术,它似乎就是为云端的应用量身定制的,所以它也被贴上了云原生应用 (Cloud Native Application) 技术的标签.目前最为流行的容器管理调度平台是 ...

  6. pillow KeyError: 'WEBP'

    描述 使用pillow库jpg转到webp报错 File "F:\Anaconda\lib\site-packages\PIL\Image.py", line 1983, in s ...

  7. oslab oranges 一个操作系统的实现 实验一

    实验目的: 搭建基本实验环境,熟悉基本开发与调试工具 对应章节:第一.二章 实验内容: 1.认真阅读章节资料 2.在实验机上安装virtualbox,并安装ubuntu 3.安装ubuntu开发环境, ...

  8. 近期做的一些DP

    UVa 1625 color length https://blog.csdn.net/Dylan_Frank/article/details/52261424 https://www.cnblogs ...

  9. 2019牛客多校第一场I Points Division(DP)题解

    题意: n个点,分成两组A,B,如果点i在A中,那么贡献值\(a_i\),反之为\(b_i\). 现要求任意\(i \in A,j \in B\)不存在 \(x_i >= x_j\) 且 \(y ...

  10. XCTF攻防世界web进阶练习—mfw

    XCTF攻防世界web进阶练习-mfw题目为mfw,没有任何提示.直接打开题目,是一个网站 大概浏览一下其中的内容,看到其中url变化其实只是get的参数的变化查看它的源码,看到有一个?page=fl ...