【问题标题】:Android: Storing multiple EditText values to a ListView using SharedPreferencesAndroid:使用 SharedPreferences 将多个 EditText 值存储到 ListView
【发布时间】:2016-01-23 00:09:27
【问题描述】:

场景: 我有四个编辑文本和三个按钮,其中,当用户在其中一个编辑文本中提供一些输入并单击按钮 1 或按钮 2 时,用户提供的输入应保存在与按钮 3 关联的活动中。一般来说,按钮 3 活动存储用户提供的输入的“历史”。

目前,我正在使用 sharedpreferences 方法,我知道如果您想存储多个值,这不是一个好方法。我曾尝试使用 SQLite 数据库解决此问题,但没有成功。

这是我在按钮 1 和按钮 2 的 onclick 方法中定义的名为“saveHistory”的方法。

private void saveHistory()
    {
        sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this);
        fd=sharedPreferences.edit();

    String et1 = et1.getText().toString();
    String et2 = et2.getText().toString();
    String et3 = et3.getText().toString();
    String et4 = et4.getText().toString();

    fd.putString("et1" , et1);
    fd.putString("et2" , et2);
    fd.putString("et3" , et3);
    fd.putString("et4" , et4);

    fd.apply();
}  

这是我的另一个类(当单击按钮 3 时,该类被调用),它检索 edittexts 值。

public class history extends Activity
{
    public static final String DEFAULT = "No data";
    ListView listView; 
    SharedPreferences sharedPreferences; 
    SharedPreferences.Editor sp; 
    public ArrayAdapter<String> adapter; 

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

    listView = (ListView) findViewById(R.id.listViewMain);

    sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this);
    sp = sharedPreferences.edit();

    String et1 = sharedPreferences.getString("et1", DEFAULT);
    String et2 = sharedPreferences.getString("et2", DEFAULT);
    String et3 = sharedPreferences.getString("et3", DEFAULT);
    String et4 = sharedPreferences.getString("et4", DEFAULT);

    if (et1.equals(DEFAULT) || et2.equals(DEFAULT) || et3.equals(DEFAULT) || et4.equals(DEFAULT)) 
    {
        Toast.makeText(this, "No history found", Toast.LENGTH_LONG).show();
    }
    else
    {
        String [] values = new String[]{et1,et2,et3,et4};
        adapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, values);
        listView.setAdapter(adapter);
        adapter.notifyDataSetChanged();
        sp.apply();
    }
}
}

我面临的问题是我只看到一个列表视图,其中只显示了 1 个值,这很明显,因为没有执行增量的代码。当我输入一个新值时,旧值会被覆盖。由于有两个与 saveHistory 方法关联的按钮,我只能获得一个值,因为只有一个列表视图。所以我的需要是我想使用 sharedpreferences 存储多个值,并且单击两个按钮应该保存值而不是覆盖彼此的值。我知道我的要求太多了,但如果您能帮助我了解如何正确使用此方案和此代码进行增量,那么我将不胜感激。

我已经处理了许多 stackoverflow 问题,其中大多数都与一个编辑文本和一个按钮以及存储和检索这些值有关。但是,我的应用程序要求不同,因此,我发布了这个问题。

【问题讨论】:

  • 如果我对您的理解正确...只需在调用保存更改功能时检索以前的共享首选项即可。例如,检查 textview 是否包含一个字符串,然后才将其保存到首选项中。现在您设置新值和空值而不检查先前的值。确实一切都丢失了
  • 为什么你不能尝试使用 sql Lite DB。这将非常有用。

标签: java android listview android-edittext sharedpreferences


【解决方案1】:

您正在检索 EditTexts 值,但您在 sharedPreferences 中添加了其他内容。

用以下代码替换您的 saveHistory() 代码:

private void saveHistory(){
    sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this);
    fd = sharedPreferences.edit();

    String bt = et1.getText().toString();
    String an = et2.getText().toString();
    String cn = et3.getText().toString();
    String in = et4.getText().toString();

    fd.putString("et1" , bt); //These lines were the problem
    fd.putString("et2" , an); //These lines were the problem
    fd.putString("et3" , cn); //These lines were the problem
    fd.putString("et4" , in); //These lines were the problem

    fd.apply();
}

编辑:很抱歉,我想我现在明白你的问题了。

您可以使用 PutStringSet() 的单个 SharedPreferences 键存储多个字符串值。您需要验证调用 saveHistory() 的按钮,然后使用此信息创建 Set

查看下面的链接以获取示例。

https://stackoverflow.com/a/9054240/2503185

在您的情况下,您可以输入类似(对于每个 EditText 值):

Set<String> faveSet = faves.getStringSet("et1");
faveSet.add(button + ":" + et1_value);
SharedPreferences.Editor editor = faves.edit();
editor.putStringSet("et1", faveSet);
editor.commit();

然后检索它并验证每个 EditText。

【讨论】:

  • 我的代码sn-p没有错,只是发问题的时候忘记改了,马上编辑问题,谢谢指出。
  • 您现在将多个具有相同名称的变量放在同一范围内String et1 = et1.getText().toString();
  • 嗯,第一个字符串 et1 (String et1 =) 是一个分配给自动完成文本视图的新字符串,所以第二个 et1 是一个自动完成文本视图,因此,两个 et1 不一样,也不一样 et2,et3 , 和 et4。我会考虑您编辑的答案,并将在我的应用程序中对其进行测试。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-05-30
  • 1970-01-01
  • 2014-03-05
  • 2011-03-16
  • 1970-01-01
  • 1970-01-01
  • 2017-10-15
相关资源
最近更新 更多