You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android如何保存当前时间日期 SharedPreferences存储重启不生效如何解决

问题根因分析
  • 你当前代码的核心问题是:从SharedPreferences读取到历史存储的时间值后,没有主动赋值给textView做界面展示,导致重启应用后虽然已经拿到了历史时间,但界面没有渲染,看起来就像功能失效
  • 次要问题:当前时间更新逻辑仅在点击cardView时触发,如果用户进入页面没有点击卡片,mydate变量不会更新,存储的永远是上次点击的时间,不符合「最后一次访问时间」的需求
  • 潜在风险:onPause中通过getActivity().getBaseContext()拿上下文的方式不稳定,如果Fragment和Activity解绑时触发onPause,getActivity()可能返回空引发崩溃
修复后代码
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);
    CardView cardView = view.findViewById(R.id.card_view2);
    textView = view.findViewById(R.id.dateTv);
    // 读取本地存储的历史访问时间
    SharedPreferences getPrefs = PreferenceManager.getDefaultSharedPreferences(requireContext());
    mydate = getPrefs.getString("Test","");
    // 修复点1:读取到历史值后直接更新界面
    textView.setText(mydate);
    
    // 修复点2:进入页面直接更新当前访问时间,不需要等用户点击,符合最后一次访问的需求
    // 如果你的业务逻辑确实需要点击才更新时间,删除这段即可
    Calendar calendar= Calendar.getInstance();
    SimpleDateFormat simpleDateFormat = new SimpleDateFormat("dd-MM-yyyy 'at' HH:mm:ss", Locale.getDefault());
    mydate = simpleDateFormat.format(calendar.getTime());
    textView.setText(mydate);

    cardView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Calendar calendar= Calendar.getInstance();
            SimpleDateFormat simpleDateFormat = new SimpleDateFormat("dd-MM-yyyy 'at' HH:mm:ss", Locale.getDefault());
            mydate = simpleDateFormat.format(calendar.getTime());
            textView.setText(mydate);
        }
    });
}

@Override
public void onPause() {
    super.onPause();
    // 修复点3:用requireContext()获取上下文,避免空指针
    SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(requireContext());
    SharedPreferences.Editor editor = sharedPreferences.edit();
    editor.putString("Test", mydate);
    editor.apply();
}
额外优化建议
  • 如果你对时间存储的可靠性要求高,可以把editor.apply()换成editor.commit(),apply()是异步写入磁盘,极端情况下App被强制杀进程可能丢失写入,commit()是同步写入,可靠性更高但会阻塞主线程,可按需选择
  • 可以把SharedPreferences的存储key、时间格式字符串抽成全局静态常量,避免后续写错key导致读取不到值

内容的提问来源于stack exchange,提问作者Charlie Brown

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 03:45:04