热门标签 | HotTags
当前位置:  开发笔记 > 后端 > 正文

androidpdf夜间模式,[老实李]Android夜间模式轻松实现

效果图:yejianmoshigif.gifAndroid官方在SupportLibrary23.2.0中已经加入了夜间主题。也就是只需要通过更换主题便可实现日间模式

效果图:

4、启动 App 时检测是否处于夜间模式

如果是则切换至夜间主题。这个需要在自己项目的 Application 中实现。可在自己项目的 Application 中添加以下代码:

这里需要介绍一下有关夜间模式的几个常量值

AppCompatDelegate.setDefaultNightMode(mode), 其中 mode 有一下四个值:

MODE_NIGHT_NO: 亮色(light)主题,不使用夜间模式

MODE_NIGHT_YES:暗色(dark)主题,使用夜间模式

MODE_NIGHT_AUTO:根据当前时间自动切换 亮色( light )/暗色( dark )主题(22:00-07:00时间段内自动切换为夜间模式)

MODE_NIGHT_FOLLOW_SYSTEM(默认选项):设置为跟随系统,通常为MODE_NIGHT_NO

override fun onCreate() {

super.onCreate()

setNightMode()

}

/**

*初始化夜间模式

*/

fun setNightMode(){

val nightMode = defaultSharedPreferences.getBoolean("night", false)

if (nightMode) {

AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES)

}else{

AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO)

}

}

5、设置页面点击 switchPreference时切换白天/夜间模式

/**

* ClassName:SettingFragment

* Description:

*/

class SettingFragment : PreferenceFragment(), Preference.OnPreferenceChangeListener {

override fun onCreateView(inflater: LayoutInflater?, container: ViewGroup?, savedInstanceState: Bundle?): View {

addPreferencesFromResource(R.xml.setting)

val switchPreference = findPreference("night") as SwitchPreference

switchPreference.onPreferenceChangeListener = this

return super.onCreateView(inflater, container, savedInstanceState)

}

override fun onPreferenceChange(preference: Preference, objValue: Any): Boolean {

val key = preference.key

if ("night" == key) {

var nightMode = defaultSharedPreferences.getBoolean("night", false)

if (nightMode) {

AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO)

} else {

AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES)

}

startActivity(Intent(activity, SettingActivity::class.java))

activity.overridePendingTransition(R.anim.activity_enter_alpha,R.anim.activity_enter_alpha)

activity.finish()

}

return true

}

}

在设置界面中对SwitchPreference设置onPreferenceChangeListener,这样当夜间模式变化的时候就先启动SettingActivity,然后再将activity finish掉,中间加上渐变的过渡动画解决闪屏问题。

动画如下:

android:duration="1"

android:fromAlpha="1.0"

android:toAlpha="0.0"/>

6、解决返回主界面,主界面的UI没有更新的问题

解决这个问题可以在切换模式后从设置页面发送一个广播,然后在 MainActivity 中接收到这个广播后重启 MainActivity 即可。根据官方的推荐更换夜间模式后需要调用 recreate() 方法刷新页面。但是 recreate() 方法巨坑无比,调用 recreate() 方法引起了诸多问题。因此解决这个问题并没有在 MainActivity 调用中调用 recreate() 方法。而是在 SettingActivity 中重写了 onKeyDown() 方法。如果切换了夜间模式则在返回时发出一个广播结束掉 MainActivity ,然后调用 startActivity() 重启了 MainActivity 并添加了启动动画,让用户感觉是只是返回了主页面。

SettingActivity:

override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean {

if (keyCode == KeyEvent.KEYCODE_BACK && event?.action == KeyEvent.ACTION_DOWN) {

goBack()

return true

}

return super.onKeyDown(keyCode, event)

}

fun goBack() {

EventBus.getDefault().post(NightEvent())

val intent = Intent(this, MainActivity::class.java)

startActivity(intent)

overridePendingTransition(R.anim.activity_enter_alpha, R.anim.activity_exit)

finish()

}

MainActivity(别忘了EventBus的注册和反注册):

/**

* 接收eventbus方法

*/

fun onEventMainThread(itemBean: NightEvent) {

print("mainactivityonEventMainThread")

finish()

}

大功告成~



推荐阅读
  • Python库在GIS与三维可视化中的应用
    Python库极大地扩展了GIS的能力,使其能够执行复杂的数据科学任务。本文探讨了几个关键的Python库,这些库不仅增强了GIS的核心功能,还推动了地理信息系统向更高层次的应用发展。 ... [详细]
  • 程序员如何优雅应对35岁职业转型?这里有深度解析
    本文探讨了程序员在职业生涯中如何通过不断学习和技能提升,优雅地应对35岁左右的职业转型挑战。我们将深入分析当前热门技术趋势,并提供实用的学习路径。 ... [详细]
  • ListView简单使用
    先上效果:主要实现了Listview的绑定和点击事件。项目资源结构如下:先创建一个动物类,用来装载数据:Animal类如下:packagecom.example.simplelis ... [详细]
  • TortoiseSVN与VisualSVN Server的安装及基本操作指南
    本文详细介绍了如何安装VisualSVN Server以及TortoiseSVN客户端,并提供了基本的操作步骤,包括配置仓库、用户管理及权限设置等关键环节。 ... [详细]
  • CentOS 7.2 配置防火墙端口开放
    本文介绍如何在 CentOS 7.2 系统上配置防火墙以开放特定的服务端口,包括 FTP 服务的临时与永久开放方法,以及如何验证配置是否生效。 ... [详细]
  • YB02 防水车载GPS追踪器
    YB02防水车载GPS追踪器由Yuebiz科技有限公司设计生产,适用于车辆防盗、车队管理和实时追踪等多种场合。 ... [详细]
  • 本文详细介绍了如何在现有的Android Studio项目中集成JNI(Java Native Interface),包括下载必要的NDK和构建工具,配置CMakeLists.txt文件,以及编写和调用JNI函数的具体步骤。 ... [详细]
  • 免费获取:全面更新的Linux集群视频教程及配套资源
    本资源包含最新的Linux集群视频教程、详细的教学资料、实用的学习课件、完整的源代码及多种软件开发工具。百度网盘链接:https://pan.baidu.com/s/1roYoSM0jHqa3PrCfaaaqUQ,提取码:41py。关注我们的公众号,获取更多更新的技术教程。 ... [详细]
  • ODBC介绍:开放式数据库连接详解
    本文详细介绍了ODBC(开放式数据库连接),这是一种允许应用程序访问多种数据库系统的标准API。自1992年由微软与Simba合作推出以来,ODBC已成为跨平台数据访问的重要标准。 ... [详细]
  • springMVC JRS303验证 ... [详细]
  • 本文探讨了在iOS平台上开发BLE(蓝牙低功耗)应用程序时遇到的挑战,特别是如何实现应用在后台模式下仍能持续扫描并连接蓝牙设备。文章提供了具体的配置方法和常见的问题解决方案。 ... [详细]
  • 如何处理MySQL命令行中文乱码问题
    本文详细探讨了MySQL命令行中出现中文乱码的原因及解决方案,通过调整配置文件和执行特定SQL命令来确保字符集正确设置,为用户提供了一个有效的解决路径。 ... [详细]
  • 本文介绍了一种利用WMI类Win32_SystemEnclosure中的ChassisTypes属性来识别计算机类型的简单方法,并提供了详细的脚本示例。 ... [详细]
  • 如何在没有额外工具箱的情况下,使用基础MATLAB生成并绘制两个变量(X,Y)的经验联合PDF和CDF? ... [详细]
  • 本文通过Python编程语言,利用Pandas和Matplotlib库,对电影数据集中的类型字段进行处理,实现电影类型的统计分析及可视化展示。 ... [详细]
author-avatar
落墨
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有