当应用程序打开时,我的应用程序为"默认字体大小"创建了一个默认的SharedPrferences(具体来说:在我的AppUtils类中为public static final String DEFAULT_FONT_SIZE_KEY = "defaultFontSize";). 看起来我可以用默认值16创建这个SharedPreferences,在创建之后,我立即try 转储所有的值键,没有任何返回. 在代码的这一点上,我还没有实现也没有调整字体大小键的值,只有第一步-创建并立即通过转储判断它是否被存储. 创建后,转储中不返回任何内容.

应用程序android.intent.action.MAINWelcomeActivity级的.在这个类中,我声明SharedPreferences,然后在onCreate中使用对AppUtils.initializeSharedPreferences的方法调用进行初始化:

...
    private SharedPreferences sharedPreferences;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_welcome);

        AppUtils.initializeSharedPreferences(this);
        sharedPreferences = AppUtils.getSharedPreferences();
...

方法initializeSharedPreferences只被调用一次,should将创建DEFAULT_FONT_SIZE_KEY,因此如果不存在SharedPreference,则创建SharedPreference,以下是AppUtils类中的方法:

    public static void initializeSharedPreferences(Context context) {
        if (sharedPreferences == null) {
            sharedPreferences = context.getSharedPreferences("SongTrackerApp", Context.MODE_PRIVATE);
            if (getDefaultFontSize(sharedPreferences) == 0) {
                saveDefaultFontSize(sharedPreferences, 16);
            }
            Log.d("AdjustTextSize", "(AppUtils) INIT: line #17, 1st Value-DEFAULT_FONT_SIZE_KEY: " + getDefaultFontSize(sharedPreferences));
        }
        Log.d("AdjustTextSize", "(AppUtils) INIT: line #19, DEFAULT_FONT_SIZE_KEY: " + getDefaultFontSize(sharedPreferences) + ", context: " + context);
    }

同样在WelcomeActivity类的onCreate中,我获得了DEFAULT_FONT_SIZE_KEY的值,然后调用一个方法来转储所有SharedPreferences(请参见dbHelper.logSharedPreferencesEntries):

        // Get all key-value pairs from SharedPreferences
        if (sharedPreferences != null) {
            // Print out all sharedPreferences:
            Log.d("AdjustTextSize", "(WelcomeActivity) line #77, DEFAULT_FONT_SIZE_KEY: " + AppUtils.getDefaultFontSize(sharedPreferences));
            dbHelper.logSharedPreferencesEntries(sharedPreferences, "WelcomeActivity");
        }

Log.d表示DEFAULT_FONT_SIZE_KEY实际上是SharedPreferences:

(WelcomeActivity) line #77, DEFAULT_FONT_SIZE_KEY: 16.0

在代码的这一点上,我仍然处于Main活动中,并调用DatabaseHelper类(dbHelper.logSharedPreferencesEntries)中的一个方法来转储所有的SharedPreferences,但是没有返回任何结果.下面是方法logSharedPreferencesEntries,它为if (allEntries.isEmpty()) ...返回‘True’:

    public void logSharedPreferencesEntries(SharedPreferences sharedPreferences, String pageName) {
        Map<String, ?> allEntries = sharedPreferences.getAll();
        // Check if there are any entries
        if (allEntries.isEmpty()) {
            Log.d("AdjustTextSize", "(DBHelper via: " + pageName + ") DUMP line #1063 No sharedPreference keys found");
            return;
        }
        // Iterate through the entries and log them
        for (Map.Entry<String, ?> entry : allEntries.entrySet()) {
            String key = entry.getKey();
            Object value = entry.getValue();
            // Display constant name, key name, and value in Log.d
            String constantName = findConstantName(key);
            Log.d("AdjustTextSize", "(DBHelper via: " + pageName + ") DUMP line #1072 - Constant: " + constantName + ", Key: " + key + ", Value: " + value.toString());
        }
    }

我研究了Stackoverflow中的其他相关条目,尽管许多与SharedPreferences个相关的问题都可以追溯到2012年-最近的任何事情似乎都没有解决我2023年的问题.

感谢您发送编修.

EDIT: 12.14.2023 In response to @ltp

谢谢你@ltp,我用editor.commit();替换了editor.apply();,后者是您的建议,并且是同步工作的,因此我应该直接看到影响,而不是异步apply().好奇的是,我在initializeSharedPreferences方法中设置了SharedPreferences:

    public static void initializeSharedPreferences(Context context) {
        if (sharedPreferences == null) {
            sharedPreferences = context.getSharedPreferences("SongTrackerApp", Context.MODE_PRIVATE);
            if (getDefaultFontSize(sharedPreferences) == 0) {
                saveDefaultFontSize(sharedPreferences, 16);
            }
        }
    }

在调用initializeSharedPreferences之后的下一行代码是方法‘转储’所有SharedPreferences--即使是commit(),我仍然得到Log.d"没有找到共享首选项键"--我知道在前一行中已经设置了它.如果我使用编程到应用程序代码中的内容更改文本大小,经过大约2-3次try 后,我确实看到‘Dump’方法显示Constant: DEFAULT_FONT_SIZE_KEY, Key: defaultFontSize, Value: 0.0,但字体大小不准确,我相信这是一个单独的问题,所以目前将忽略.如有其他 comments ,敬请垂询!

推荐答案

如果使用的是SharedPreferences.Editor.apply(),请将其替换为SharedPreferences.Editor.commit().引用文件中的内容:

与Commit()不同,Commit()将其首选项写出为Persistent 存储同步时,Apply()将其更改提交到内存中 立即共享首选项,但启动异步提交到 磁盘,您将不会收到任何故障通知

Java相关问答推荐

ActivityCompat.请求收件箱自动拒绝权限

Saxon 9:如何从Java扩展函数中的net.sf.saxon.expr. XPathContent中获取声明的变量

try 使用Java 9或更高版本对特殊对象图进行解析时出现NullPointerException

多个Java线程和TreeMap.put()的非预期行为

在bash中将数组作为Java程序的参数传递

获取字符串中带空格的数字和Java中的字符

如何确定springboot在将json字段转换为Dto时如何处理它?

返回响应时,CamelCase命名约定不起作用

当b是一个字节并且在Java中值为-1时,为什么b>;>;>;1总是等于-1?

如何在透视表中添加对计数列的筛选?

通过Java列表中的某些字段搜索值

在应用程序运行时更改LookAndFeel

基于Java中mm/dd/yy格式的最近日期对数组列表进行排序

将BlockingQueue+守护程序线程替换为执行器

如何在右击时 Select 新行?

如何在Struts2中使用操作类中的结果注释重定向到不同的命名空间

在输入端没有可行的替代方案'; Select *';

在不带instanceof或switch的java中记录模式

JAVA 正则表达式识别字符串string或字符串内的字符char

找不到 jar 文件系统提供程序try 使用 jdeps 和 jlink 创建收缩 Java 映像来运行 Minecraft