热门标签 | 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()

}

大功告成~



推荐阅读
  • 几何画板展示电场线与等势面的交互关系
    几何画板是一款功能强大的物理教学软件,具备丰富的绘图和度量工具。它不仅能够模拟物理实验过程,还能通过定量分析揭示物理现象背后的规律,尤其适用于难以在实际实验中展示的内容。本文将介绍如何使用几何画板演示电场线与等势面之间的关系。 ... [详细]
  • 在Linux系统中配置并启动ActiveMQ
    本文详细介绍了如何在Linux环境中安装和配置ActiveMQ,包括端口开放及防火墙设置。通过本文,您可以掌握完整的ActiveMQ部署流程,确保其在网络环境中正常运行。 ... [详细]
  • 本文详细探讨了在Android 8.0设备上使用ChinaCock的TCCBarcodeScanner进行扫码时出现的应用闪退问题,并提供了解决方案。通过调整配置文件,可以有效避免这一问题。 ... [详细]
  • RecyclerView初步学习(一)
    RecyclerView初步学习(一)ReCyclerView提供了一种插件式的编程模式,除了提供ViewHolder缓存模式,还可以自定义动画,分割符,布局样式,相比于传统的ListVi ... [详细]
  • 本文详细介绍了macOS系统的核心组件,包括如何管理其安全特性——系统完整性保护(SIP),并探讨了不同版本的更新亮点。对于使用macOS系统的用户来说,了解这些信息有助于更好地管理和优化系统性能。 ... [详细]
  • 高效解决应用崩溃问题!友盟新版错误分析工具全面升级
    友盟推出的最新版错误分析工具,专为移动开发者设计,提供强大的Crash收集与分析功能。该工具能够实时监控App运行状态,快速发现并修复错误,显著提升应用的稳定性和用户体验。 ... [详细]
  • 程序员如何优雅应对35岁职业转型?这里有深度解析
    本文探讨了程序员在职业生涯中如何通过不断学习和技能提升,优雅地应对35岁左右的职业转型挑战。我们将深入分析当前热门技术趋势,并提供实用的学习路径。 ... [详细]
  • 本文介绍如何在 Android 中通过代码模拟用户的点击和滑动操作,包括参数说明、事件生成及处理逻辑。详细解析了视图(View)对象、坐标偏移量以及不同类型的滑动方式。 ... [详细]
  • 本文详细介绍如何使用Python进行配置文件的读写操作,涵盖常见的配置文件格式(如INI、JSON、TOML和YAML),并提供具体的代码示例。 ... [详细]
  • 导航栏样式练习:项目实例解析
    本文详细介绍了如何创建一个具有动态效果的导航栏,包括HTML、CSS和JavaScript代码的实现,并附有详细的说明和效果图。 ... [详细]
  • 本文深入探讨了 Java 中的 Serializable 接口,解释了其实现机制、用途及注意事项,帮助开发者更好地理解和使用序列化功能。 ... [详细]
  • DNN Community 和 Professional 版本的主要差异
    本文详细解析了 DotNetNuke (DNN) 的两种主要版本:Community 和 Professional。通过对比两者的功能和附加组件,帮助用户选择最适合其需求的版本。 ... [详细]
  • 由中科院自动化所、中科院大学及南昌大学联合研究提出了一种新颖的双路径生成对抗网络(TP-GAN),该技术能通过单一侧面照片生成逼真的正面人脸图像,显著提升了不同姿态下的人脸识别效果。 ... [详细]
  • 本文介绍如何在 Visual Studio Code 中使用 Jupyter Notebook 插件,包括创建、编辑和运行笔记本的基本操作。 ... [详细]
  • 多核环境下大规模线性分类的并行对偶坐标下降算法
    本文介绍了一种适用于多核环境的大规模线性分类问题的并行对偶坐标下降算法。该方法通过优化计算资源的分配,显著提高了处理效率和模型性能。论文《Parallel Dual Coordinate Descent Method for Large-scale Linear Classification in Multi-core Environments》详细探讨了这一算法,并提供了实验验证。 ... [详细]
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社区 版权所有