【问题标题】:Adding the value of a text field and a saved value from SharedPreferences to an array将文本字段的值和 SharedPreferences 中保存的值添加到数组
【发布时间】:2021-10-28 02:02:46
【问题描述】:

我有一个文本字段,我希望保存它的值。此外,如果同一个文本字段之前有另一个值,也应该保存它。

我是这样尝试的:

ArrayList<String> listOfTexts = new ArrayList<>();

SharedPreferences mPrefs = getContext().getSharedPreferences("k-texts", Context.MODE_PRIVATE);
SharedPreferences.Editor prefsEditor = mPrefs.edit();

listOfTexts.add(Objects.requireNonNull(_customTextField.getText()).toString());
listOfTexts.add(mPrefs.getString("k-text", ""));

Gson gson = new Gson();
String json = gson.toJson(listOfTexts);
prefsEditor.putString("k-text", json);
prefsEditor.apply();

我在该字段中保存了多个值。值为:abcd

好吧,在这种情况下,json 返回 ["d","["c","[\"a\",\"\",\"b\",\"[\ \\"a\\\",\\\"\\\"]\"]"]"] 但我想要的是 ["a", "b", "c", "d"]

我怎样才能得到我想要的结果?

【问题讨论】:

  • 您将数据存储为 json,而下次从 sharedprefs 获取数据时,它将在 json 中,因此您需要将 json 字符串转换为对象列表,然后将所有这些对象转换为 listOfTexts需要保存在 sharedprefs 中
  • @AgentP 谢谢,你能给我一个例子吗?

标签: java android sharedpreferences


【解决方案1】:

在这种情况下,您的逻辑会存在一些冲突。而是使用 Gson 使用 String.format

当您在您的arraylist 中添加a 并保存到共享偏好时,它会给出完美的结果[a]

然后,您尝试从 edittext 添加 b 并从首选项中添加 [a] - 结果 [b,[a]]。当你试图把它变成 json 时,它的制作太冲突了。

但是,根据您的要求,结果应该是["a", "b", "c", "d"]

  1. 因此,当从首选项中检索数据时,请替换 [] 。替换后看起来像 "a""a", "b" 或 etc 。我们不需要来自偏好的[],我们会从 ArrayList 中获取它。

    valuefromPrefrence = mPrefs.getString("k-text", null);
    try {
        finalpreferenceValue = valuefromPrefrence.replace("[", "").replace("]",    "");
    } catch (Exception e) {
     e.printStackTrace();
    }
    
  2. 我们可以检查保存的数据以跳过重复的数据存储。

    if (finalpreferenceValue != null && finalpreferenceValue.contains(valueofeditText)) {
             Toast.makeText(getApplicationContext(), "Data already exists", Toast.LENGTH_SHORT).show();
         } else {
    
  3. 然后在将字符串添加到arraylist之前,按照我们的要求格式化字符串。

    String allvalues = String.format("" + "%s," + "\"" + "%s\"", finalpreferenceValue, valueofeditText);
    
  4. 然后添加格式化字符串并存储数据。就是这样。

所以你可以检查 -

        ArrayList<String> listOfTexts = new ArrayList<>();

    SharedPreferences mPrefs = getApplicationContext().getSharedPreferences("k-texts", Context.MODE_PRIVATE);
    SharedPreferences.Editor prefsEditor = mPrefs.edit();


    String valueofeditText = Objects.requireNonNull(_customTextField.getText()).toString();
    String valuefromPrefrence, finalpreferenceValue = null;

    valuefromPrefrence = mPrefs.getString("k-text", null);
    try {
        finalpreferenceValue = valuefromPrefrence.replace("[", "").replace("]", "");
    } catch (Exception e) {
        e.printStackTrace();
    }
    if (finalpreferenceValue != null && finalpreferenceValue.contains(valueofeditText)) {
        Toast.makeText(getApplicationContext(), "Data already exists", Toast.LENGTH_SHORT).show();
    } else {

        String allvalues = String.format("" + "%s," + "\"" + "%s\"", finalpreferenceValue, valueofeditText);

        //replace null, got from first time load   valuefromPrefrence = mPrefs.getString("k-text", "");

        String rallvalues = allvalues.replace("null,", "");

        listOfTexts.add(rallvalues);

        prefsEditor.putString("k-text", String.valueOf(listOfTexts));
        prefsEditor.apply();
    }

【讨论】:

  • 完美答案!正是我想要的。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-07-16
  • 2015-09-06
  • 1970-01-01
  • 1970-01-01
  • 2018-06-22
  • 2014-03-22
  • 2019-03-09
相关资源
最近更新 更多