使用SharedPreferences有效地将多个EditText保存在一个活动中

时间:2018-11-11 16:17:18

标签: android android-studio android-edittext sharedpreferences

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

就我而言,我们谈论的是〜50个EditTexts。对于问题Q2,我想出了如何保存一个EditText的方法,但是,当我重新启动每个EditText时,为不同的EditTexts复制代码(并使用不同的参数)时,它会显示相同的单词。

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();


        }
    });
}

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

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

谢谢。

2 个答案:

答案 0 :(得分:1)

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

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

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

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

EditText2的内容将根据您的偏好替换EditText1的内容,因为您使用的是相同的密钥。

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

我希望这会有所帮助。

答案 1 :(得分:0)

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

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

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

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