【问题标题】:Saving several EditTexts in one activity efficiently with SharedPreferences使用 SharedPreferences 在一项活动中有效保存多个 EditText
【发布时间】:2018-11-11 16:17:17
【问题描述】:

我找到了类似问题的答案,但没有一个对我有用。
Q1:Saving several EditText after program closes
Q2:Save latest text from Edittext and restore it after onDestroy

在我的例子中,我们谈论的是大约 50 个 EditText。对于问题 Q2,我想出了如何保存一个 EditText,但是当我复制不同 EditTexts 的代码(并使用不同的参数)时,重新启动每个 EditText 时都会显示相同的单词。

public static final String LAST_TEXT1 = "";
public static final String LAST_TEXT2 = "";
public EditText myEditText1, myEditText2;

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.myactivity);

    myEditText1= (EditText)findViewById(R.id.myEditText1);
    final SharedPreferences pref1= PreferenceManager.getDefaultSharedPreferences(this);
    myEditText1.setText(pref.getString(LAST_TEXT1, ""));
    myEditText1.addTextChangedListener(new TextWatcher() {
        @Override
        public void beforeTextChanged(CharSequence s, int start, int count, int after) {

        }

        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {

        }

        @Override
        public void afterTextChanged(Editable s) {

            pref.edit().putString(LAST_TEXT1, s.toString()).commit();


        }
    });

    myEditText2= (EditText)findViewById(R.id.myEditText2);
    final SharedPreferences pref2= PreferenceManager.getDefaultSharedPreferences(this);
    myEditText2.setText(pref.getString(LAST_TEXT2, ""));
    myEditText2.addTextChangedListener(new TextWatcher() {
        @Override
        public void beforeTextChanged(CharSequence s, int start, int count, int after) {

        }

        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {

        }

        @Override
        public void afterTextChanged(Editable s) {

            pref.edit().putString(LAST_TEXT2, s.toString()).commit();


        }
    });
}

基本上,这几次都改变了所有参数。 (pref, myEditText,LAST_TEXT) 但是所有不同的 EditTexts(如 myEditText1 和 myEditText2)都会在重新启动时显示相同的单词。

有没有什么有效的方法来保存所有这些内容?
是否有更好的方法将字符串保存在表格中(我是初学者) 如果没有“有效”的方法来保存所有这些 EditTexts,我该如何更改我的代码以便正确保存数据?

提前致谢。

【问题讨论】:

  • 里面的edittexts是recyclerView还是gridView?

标签: android android-edittext sharedpreferences


【解决方案1】:

根据您的代码,您对所有 EditText 使用相同的密钥,这就是它返回给您的原因:

public static final String LAST_TEXT1 = "";
public static final String LAST_TEXT2 = "";

这里LAST_TEXT1LAST_TEXT2 是相等的。 SharedPreferences 是基于键/值的存储选项。如果要为所有编辑文本保存不同的值,请使用不同的键。我建议不要使用空字符串。

您还可以使用一个键并存储一个对象,该对象包含您想要的所有 edittexts 值结构化方式,您应该能够轻松检索数据的方式,例如使用 JSONArray 并对其进行字符串化。

EditText2 的内容将在您的首选项中替换 EditText1 的内容,因为您使用的是相同的密钥。

当您尝试检索您的内容时,将显示"" 的关联值。 LAST_TEXT1LAST_TEXT2 在这里只是变量。键是变量中包含的内容。

我希望这会有所帮助。

【讨论】:

  • 你是对的,关键是这里的错误。然后我会看看 JSONArray,谢谢你的提示!现在编辑键就可以了,谢谢。
  • 太棒了!如果您有问题,请随时询问更多信息或发布其他问题
【解决方案2】:

1.SharedPreference 将数据保存在键值对中。您保存一个键的数据,并在需要时使用相同的键来恢复该值,即使应用程序已关闭。

在您的情况下,您使用两个变量来存储字符串键,命名为 LAST_TEXT1LAST_TEXT2但遗憾的是,两者都带有相同的值、“”或空字符串。由于两个键在技术上是相同的,因此您将获得相同的结果。像这样定义这两个键以获得不同的结果:

public static final String LAST_TEXT1 = "LAST_TEXT1";
public static final String LAST_TEXT2 = "LAST_TEXT2";

2.SharedPreference 用于简单和简短的键值。如果您的值超过几个字,我建议使用 Sqlite Database 或类似的长时间数据持久化方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-05
    • 2017-10-01
    • 2017-10-07
    • 2019-05-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多