当前位置: 首页 > 知识库问答 >
问题:

让CheckBoxPreference在SharedReferences中存储字符串(“true”/“false”),而不是布尔值

翁和颂
2023-03-14

我有一个PreferentFragment,它的内容是从。包含CheckBoxPreference的xml文件

    <CheckBoxPreference
          android:title="@string/pref_secure_conn"
          android:key="enable_secure_connection"
          android:defaultValue="false"/>

如您所知,当用户与此Preance交互时,共享首选项对象会自动更新,以便android: key现在包含适当的布尔值。

但是,我想使用String而不是Boolean:是否有任何方法可以使CheckBoxPreection使用String值而不是Boolean值,以便我以后可以使用该键调用getString?

目前,我只是在听“onShared优先更改”并手动更改它,但也许有更好的方法。(另一个明显的修复方法是在需要此值时使用getBoolean而不是getString,但让我们假设我不能这样做)

共有3个答案

裴心思
2023-03-14

这个怎么样:

    final String currentBooleanString = sharedPreferences.getString(
            KEY_PREF_CURRENT_BOOLEAN, "true");
    final CheckBoxPreference checkBoxPreference = new CheckBoxPreference(
            this);
    checkBoxPreference.setChecked(currentBooleanString.equals("true"));
    checkBoxPreference
            .setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {

                @Override
                public boolean onPreferenceChange(Preference preference,
                        Object newValue) {
                    if (!checkBoxPreference.isChecked()) {
                        sharedPreferences
                                .edit()
                                .putString(KEY_PREF_CURRENT_BOOLEAN,
                                        "false").commit();
                    } else {
                        sharedPreferences
                                .edit()
                                .putString(KEY_PREF_CURRENT_BOOLEAN,
                                        "true").commit();
                    }
                    return true;
                }
            });
    preferenceScreen.addPreference(checkBoxPreference);

其中"KEY_PREF_CURRENT_BOOLEAN"是用于在应用程序共享首选项中保存首选项的关键字符串。

景育
2023-03-14

保存SharedReferences时,可以通过调用特定方法来指定其类型,例如:

SharedReferences。编辑putBoolean共享引用。编辑putFloat共享引用。编辑putString

如果您调用putBoolean,方法将期望布尔作为第二个参数。但是,由于您想要保存一个字符串,您应该调用putString。如果您的变量是布尔,您需要将其更改为字符串。

恢复:

    Boolean myBoolean = false;
    SharedPreferences sharedPref = ctx.getSharedPreferences(AppSettings.PREFERENCES_FILE, Context.MODE_PRIVATE);
    SharedPreferences.Editor editor = sharedPref.edit();
    editor.putString("myBoolean, String.valueOf(myBoolean));
    editor.apply();
杨研
2023-03-14

我能想到的最简单的方法是继承CheckBoxPreference并保存Preference:

package com.example.preferencestest;

import android.content.Context;
import android.content.SharedPreferences;
import android.preference.CheckBoxPreference;
import android.util.AttributeSet;

public class StringCheckBoxPreference extends CheckBoxPreference {
    public StringCheckBoxPreference(Context context) { super(context); }
    public StringCheckBoxPreference(Context context, AttributeSet attrs) { super(context, attrs); }
    public StringCheckBoxPreference(Context context, AttributeSet attrs,
            int defStyle) { super(context, attrs, defStyle); }

    @Override
    public void setChecked(boolean checked) {
        super.setChecked(checked);
        SharedPreferences p = getSharedPreferences();
        SharedPreferences.Editor e = p.edit();
        e.putString(getKey()+"asString", String.valueOf(checked));
        e.apply();
    }
}

您可以将此类添加到首选项活动xml中,如下所示:

<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" >

    <com.example.preferencestest.StringCheckBoxPreference
        android:defaultValue="true"
        android:key="myCheckBox"
        android:summary="@string/pref_description_social_recommendations"
        android:title="@string/pref_title_social_recommendations"
    />

    <CheckBoxPreference
        android:defaultValue="true"
        android:key="example_checkbox"
        android:summary="@string/pref_description_social_recommendations"
        android:title="@string/pref_title_social_recommendations" />
 类似资料:
  • 我有接收JSON对象的REST资源,该JSON对象是从用户ID到某个布尔值的映射,该布尔值指示该用户是否有错误。 由于我希望有大量的用户,所以我希望通过使用1/0而不是true/false来缩小这个JSON的大小。 我尝试了一下,发现在淡化过程中,Jackson会成功地将1/0转换成true/false,但是有没有办法告诉Jackson(也许使用注释?)将此布尔字段序列化为1/0而不是true/f

  • 我确信我在MongoDB查询中遗漏了一些非常基本的东西,似乎无法得到这个简单的条件。 考虑这个集合 我只想查询所有“未删除”的项目 我知道如何查找“已删除”标志设置为true的项目: 但是如何查找所有未被(例如,否定上述查询,或者换句话说,任何没有字段的项目,或者具有值 我通过猜测尝试了什么(请不要笑...) (不返回任何结果) 错误:{“$err”:“无效运算符:$eq”,“代码”:10068}

  • 问题内容: 不出所料,空元组不包含1 但是返回的值不等于 换一种方式来看,运算符返回的a既不是也不是: 但是,如果对原始表达式加上括号,则会恢复正常行为 或其值存储在变量中 在Python 2和Python 3中都观察到此行为。 你能解释发生了什么吗? 问题答案: 您正在遇到比较运算符链接;也 没有 意思。 相反,比较是链接在一起的,该表达式的真正含义是: 因为已经为false,所以将完全忽略链接

  • 问题内容: 我有一个数据结构以JSON格式存储,并使用serializeJSON函数进行了转换。我遇到的问题是在CF中可以是布尔值的字符串(例如Yes,No,True和False)被转换为JSON作为布尔值。下面是示例代码。关于如何防止这种情况的任何想法? 码: 结果: 问题答案: 在字符串中添加一个额外的空格以防止将其转换为布尔值,然后在稍后阶段进行修剪。

  • 问题内容: 我创建了一个带有复选框的简单页面: 该URL两次用MyCheckBox值填充!因此: 如果复选框为true,则仅重复该值。如果设置为false,它将仅在查询字符串中出现一次。 上面的代码得到了简化,因为我在窗体上有几个下拉菜单和一个文本框,它们可以正常工作。我认为我从这个问题中遗漏的代码没有什么异常之处。 是否有人在查询字符串参数重复方面有类似的问题? 问题答案: 此行为是设计使然的复

  • 我发现了这个语法: 这个有两个点的语法是什么:叫? 在哪里可以找到有关它的信息? 它是仅适用于布尔值还是以其他不同的方式实现?