做淘客需要网站网站认证费用

张小明 2026/1/10 22:38:31
做淘客需要网站,网站认证费用,网络服务器架设,wordpress双站 中英文在车机#xff08;Android Automotive#xff09;项目开发中#xff0c;用户经常会在白天和夜晚切换车辆的仪表盘主题#xff0c;这时我们的 App 也需要自动跟随系统切换到对应的白天或黑夜 UI#xff0c;避免刺眼或看不清内容。 本文基于一个真实的车机用户报告 App 项目…在车机Android Automotive项目开发中用户经常会在白天和夜晚切换车辆的仪表盘主题这时我们的 App 也需要自动跟随系统切换到对应的白天或黑夜 UI避免刺眼或看不清内容。本文基于一个真实的车机用户报告 App 项目完整分享如何优雅实现 App 跟随系统自动切换暗色模式同时解决切换过程中常见的界面重影、页面跳回、数据重置等问题。最后还会回答大家最关心的如果 App 有多个 Activity多个界面该怎么处理一、核心实现三步搞定自动跟随系统暗色模式1. 主题继承 DayNight 主题必须在res/values/themes.xml中stylenameTheme.CheryUserReportparentTheme.AppCompat.DayNight.NoActionBar!-- 你的自定义颜色、样式 -- item namecolorPrimarycolor/main_color/item !-- ... --/style这样 AppCompat 就能自动根据系统暗色模式加载对应的资源白天加载res/values/、res/drawable/黑夜自动加载res/values-night/、res/drawable-night/2. 在 Application 中设置跟随系统最佳位置publicclassUserReportApplicationextendsApplication{OverridepublicvoidonCreate(){// 必须最先设置确保所有 Activity 创建前生效AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM);super.onCreate();ContextHolder.init(this);LogUtils.i(CheryUserApp,Application onCreate);}}放在 Application 是最佳实践比放在 Activity 更早、更全局、更安全。packagecom.chery.userreport;importandroid.os.Build;importandroid.os.Bundle;importandroid.view.Window;importandroid.view.WindowInsetsController;importandroid.widget.RadioButton;importandroid.widget.RadioGroup;importandroidx.annotation.RequiresApi;importandroidx.appcompat.app.AppCompatActivity;importandroidx.appcompat.app.AppCompatDelegate;importandroidx.core.content.ContextCompat;importandroidx.core.graphics.Insets;importandroidx.core.view.ViewCompat;importandroidx.core.view.WindowInsetsCompat;importandroidx.fragment.app.Fragment;importandroidx.fragment.app.FragmentManager;importandroidx.fragment.app.FragmentTransaction;importcom.chery.userreport.drivingbehavior.DrivingBehaviorFragment;importcom.chery.userreport.energyanalysis.EnergyAnalysisFragment;importcom.chery.userreport.travelreport.TravelReportFragment;importcom.chery.userreport.energystatistics.EnergyStatisticsFragment;publicclassMainActivityextendsAppCompatActivity{privateFragmentManagerfragmentManager;privateFragmentcurrentFragment;privatestaticfinalStringKEY_CURRENT_POSITIONcurrent_position;OverrideprotectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);setupEdgeToEdge();if(getSupportActionBar()!null){getSupportActionBar().hide();}fragmentManagergetSupportFragmentManager();RadioGroupradioGroupfindViewById(R.id.main_radio_group);intcurrentPosition0;// 默认位置if(savedInstanceState!null){// recreate 时恢复上次保存的位置currentPositionsavedInstanceState.getInt(KEY_CURRENT_POSITION,0);// 系统已经自动恢复了之前 add 的 Fragment直接查找当前显示的currentFragmentfragmentManager.findFragmentById(R.id.main_fragment_container);}// 显示对应的 FragmentshowFragment(currentPosition);// 恢复 RadioGroup 选中状态checkRadioButtonByPosition(radioGroup,currentPosition);radioGroup.setOnCheckedChangeListener((group,checkedId)-{// 兼容你的布局只有第一个有 id后三个没有所以用 indexOfChild 计算位置RadioButtoncheckedButtonfindViewById(checkedId);intpositionradioGroup.indexOfChild(checkedButton);showFragment(position);});}OverrideprotectedvoidonSaveInstanceState(BundleoutState){super.onSaveInstanceState(outState);// 保存当前 tab 位置outState.putInt(KEY_CURRENT_POSITION,getCurrentPosition());}RequiresApi(Build.VERSION_CODES.LOLLIPOP)privatevoidsetupEdgeToEdge(){WindowwindowgetWindow();window.setDecorFitsSystemWindows(false);window.setStatusBarColor(ContextCompat.getColor(this,R.color.main_bg));WindowInsetsControllercontrollerwindow.getInsetsController();if(controller!null){controller.setSystemBarsAppearance(WindowInsetsController.APPEARANCE_LIGHT_STATUS_BARS,WindowInsetsController.APPEARANCE_LIGHT_STATUS_BARS);}ViewCompat.setOnApplyWindowInsetsListener(findViewById(android.R.id.content),(v,windowInsets)-{InsetsinsetswindowInsets.getInsets(WindowInsetsCompat.Type.systemBars());v.setPadding(insets.left,insets.top,insets.right,insets.bottom);returnwindowInsets;});}privatevoidshowFragment(intposition){// 先尝试复用已存在的 FragmentStringtaggetFragmentTag(position);FragmenttargetFragmentfragmentManager.findFragmentByTag(tag);if(targetFragmentnull){targetFragmentcreateFragment(position);}FragmentTransactiontransactionfragmentManager.beginTransaction();// 隐藏当前 Fragmentif(currentFragment!nullcurrentFragment!targetFragment){transaction.hide(currentFragment);}// 显示目标 Fragmentif(targetFragment.isAdded()){transaction.show(targetFragment);}else{transaction.add(R.id.main_fragment_container,targetFragment,tag);}transaction.commitNowAllowingStateLoss();currentFragmenttargetFragment;}privateFragmentcreateFragment(intposition){switch(position){case0:returnnewEnergyStatisticsFragment();case1:returnnewEnergyAnalysisFragment();case2:returnnewDrivingBehaviorFragment();case3:returnnewTravelReportFragment();default:returnnewEnergyStatisticsFragment();}}privateStringgetFragmentTag(intposition){returnfragment_position;}privateintgetCurrentPosition(){if(currentFragmentnull)return0;StringtagcurrentFragment.getTag();if(tag!nulltag.startsWith(fragment_)){try{returnInteger.parseInt(tag.substring(fragment_.length()));}catch(NumberFormatExceptione){return0;}}return0;}/** 根据位置选中对应的 RadioButton兼容无 id 的情况 */privatevoidcheckRadioButtonByPosition(RadioGroupradioGroup,intposition){if(position0positionradioGroup.getChildCount()){RadioButtonbutton(RadioButton)radioGroup.getChildAt(position);button.setChecked(true);}}}3. 使用 -night 资源限定符定义夜间 UIres/values/colors.xml→ 日间颜色res/values-night/colors.xml→ 夜间颜色res/drawable/icon_day.png→ 日间图标res/drawable-night/icon_night.png→ 夜间图标系统切换时App 会自动加载对应资源无需手动刷新颜色。二、切换时常见问题及解决方案车机系统切换暗色模式会触发 Activityrecreate()这会导致一系列问题问题1界面重影多个 Fragment 叠加原因原始代码每次切换 tab 都remove add新 Fragmentrecreate 后系统自动恢复旧 Fragment你又 add 了一个新的一样的 → 重影。解决改为hide/show 复用 Fragment 实例并正确处理savedInstanceState具体代码见之前的 MainActivity 完整实现问题2切换后页面跳回第一个 tab解决在onSaveInstanceState保存当前 tab 位置recreate 时恢复并选中对应 RadioButton问题3Fragment 内数据重置最常见原因recreate 后 Fragment 重新创建onViewCreated 中又重新请求网络/数据库数据。最佳解决使用ViewModel保存业务数据classEnergyStatisticsViewModelextendsViewModel{privateMutableLiveDataListDatadatanewMutableLiveData();publicvoidloadData(){// 只加载一次或根据需要刷新// 数据存到 LiveDatarecreate 不丢失}}classEnergyStatisticsFragmentextendsFragment{privateEnergyStatisticsViewModelviewModel;OverridepublicvoidonViewCreated(...){viewModelnewViewModelProvider(this).get(EnergyStatisticsViewModel.class);viewModel.getData().observe(getViewLifecycleOwner(),list-{updateUI(list);});if(viewModel.getData().getValue()null){viewModel.loadData();// 只在数据为空时加载}}}ViewModel 会存活于 Activity recreate数据完美保留。另外RecyclerView 滚动位置、EditText 输入内容等Android 会自动恢复前提是 View 有 id。三、多个 Activity多个界面怎么处理这是大家最关心的问题答案很简单你什么都不需要额外做因为你已经在Application.onCreate()中全局设置了AppCompatDelegate.setDefaultNightMode(MODE_NIGHT_FOLLOW_SYSTEM);→所有 Activity 都自动生效无需每个 Activity 重复写代码。所有 Activity 的主题都继承自Theme.AppCompat.DayNight.*通常在 themes.xml 中统一定义 AppTheme系统切换暗色模式时会同时 recreate 所有当前在栈中的 Activity每个 Activity 都会自动加载对应 -night 资源实际处理建议每个 Activity 同样使用hide/show 管理 Fragment如果有多个 Fragment每个页面使用ViewModel 保存关键数据如果有需要全局共享的数据如用户登录状态、主题偏好可以放在 Application 或 Singleton 中这样无论你的 App 有 1 个还是 10 个 Activity切换系统暗色模式时所有界面自动变暗/变亮当前页面不跳转数据不丢失无重影、无闪烁仅短暂重绘正常现象四、总结最佳实践清单步骤操作说明1主题继承Theme.AppCompat.DayNight启用自动资源切换2在 Application 中设置MODE_NIGHT_FOLLOW_SYSTEM全局生效最早执行3使用-night文件夹定义夜间资源自动加载4Fragment 用 hide/show tag 复用避免重影5保存/恢复当前 tab 位置页面不跳回6使用 ViewModel 保存业务数据数据不重置7多 Activity 项目无需额外处理自动全局生效做完这几步你的车机 App 就能完美跟随系统切换白天黑夜模式用户体验大幅提升如果你正在开发车机或需要支持暗色模式的 App强烈推荐按这个方案实施亲测稳定可靠。欢迎留言讨论你的实现方式本文代码已在真实车机项目中运行半年稳定无问题
版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

百度做网站电话多少钱二手房

开源通信应用终极配置指南:轻松实现安全通话与即时消息 【免费下载链接】linphone-android 项目地址: https://gitcode.com/gh_mirrors/li/linphone-android 在当今数字时代,寻找一款既安全又功能全面的通信应用变得尤为重要。Linphone作为一款优…

张小明 2026/1/9 22:01:24 网站建设

怎么找合适的网站开发网站开发需要的技术

当夜幕降临,城市灯火通明,数百万人的安全如何保障?传统模式下,指挥中心的大屏幕上闪烁着密密麻麻的监控画面,值班人员需要同时关注数十个系统界面——交通流量、警力分布、消防状态、突发事件……信息过载与决策延迟成…

张小明 2026/1/10 15:20:37 网站建设

厦门网站建设工作室云商城app官方下载

VSFTP 配置与优化全攻略 1. 修改 FTP 欢迎信息 在配置 VSFTP 时,我们可以修改用户登录时看到的欢迎信息。具体操作步骤如下: 1. 滚动找到如下行: #ftpd_banner=Welcome to blah FTP service取消该行注释,并按需修改信息,例如: ftpd_banner=Welcome to my new FTP s…

张小明 2026/1/10 12:55:52 网站建设

网站开发素材代码中国摄影网站有哪些

配置基于 VS Code CMake 的 RK3588 交叉编译开发环境 (1)安装cmake工具(2)编写 CMake 交叉编译配置文件 (toolchain.cmake) 这段 CMake 配置代码的目的是为了告诉 CMake 如何进行交叉编译 set(CMAKE_SYSTEM_NAME Linux) set(CMAK…

张小明 2026/1/10 15:20:33 网站建设

兰州网站推广排名设计素材下载网站

PyTorch-CUDA-v2.9镜像能否处理TB级数据集?DataLoader性能调优 在深度学习的实际工程中,我们常常会遇到这样的场景:模型已经设计完毕,GPU集群也已就位,但训练速度却远低于预期。打开 nvidia-smi 一看,GPU利…

张小明 2026/1/10 15:20:34 网站建设

韩都衣舍的网站建设济阳做网站多少钱

深入探究Linux PAM安全技术 1. 前言 在Linux系统中,可插拔认证模块(PAM)是保障系统安全的重要工具。它可以对用户的认证、资源使用、登录时间等进行细致的管理和限制,从而有效提升系统的安全性。接下来,我们将详细介绍如何利用PAM实现资源限制、时间限制、密码强度检查、…

张小明 2026/1/10 15:20:38 网站建设