【问题标题】:ArrayList of EditText to SharedPreferencesEditText 到 SharedPreferences 的 ArrayList
【发布时间】:2016-01-04 13:33:51
【问题描述】:

我为安卓开发了一个应用程序。

我有很多EditText 类型的变量。我想使用Button 来保存用户输入的数据。当我尝试将每个EditText 一个一个放入时,问题就开始了。 所以我考虑使用ArrayList。我读到我不能将ArrayList 直接放入SharedPreferences。但是哪种方式更好呢?使用Hash,可序列化还是一个一个?我是初学者,所以我不知道哪种方式更好 - 这意味着更易于使用但更长。

在这种情况下,我尝试使用一个变量(仅“m”),但是当我单击按钮保存它时,它会从 app.

如何改进此代码以使其正常工作?

这是代码:

public class MainActivity extends ActionBarActivity {
    public static final String MY_PREFS_NAME = "MyPrefsFile";


    EditText m,m1,m2,m3,m00,m11,m22,m33;
    Button button10;
    SharedPreferences sharedPreferences;

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

        final EditText m = (EditText) findViewById(R.id.message);
        final EditText m1 = (EditText) findViewById(R.id.message1);
        final EditText m2 = (EditText) findViewById(R.id.message2);
        final EditText m3 = (EditText) findViewById(R.id.message3);
        final EditText m00 = (EditText) findViewById(R.id.message00);
        final EditText m11 = (EditText) findViewById(R.id.message11);
        final EditText m22 = (EditText) findViewById(R.id.message22);
        final EditText m33 = (EditText) findViewById(R.id.message33);

        List<EditText> messageLIST = new ArrayList<EditText>(){{
            add(m);
            add(m1);
            add(m2);
            add(m3);
            add(m00);
            add(m11);
            add(m22);
            add(m33);
        }};
        for(int i = 0; i < messageLIST.size(); i++)
        {
            messageLIST.get(i);
        }


        sharedPreferences = getApplication().getSharedPreferences(MY_PREFS_NAME, MODE_PRIVATE);
        String numberValue = sharedPreferences.getString("numberValue", null);
        m.setText(numberValue);


    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            return true;
        }

        return super.onOptionsItemSelected(item);
    }

    public void saveButton(View view)
    {
        Intent intent = new Intent(this,MainActivity.class);
        m.getText().toString();
        SharedPreferences sharedPreferences = getApplication().getSharedPreferences(MY_PREFS_NAME, MODE_PRIVATE);
        SharedPreferences.Editor editor = sharedPreferences.edit();
        editor.putString("numberValue", m.getText().toString());
        editor.commit();
        startActivity(intent);

    }
}

【问题讨论】:

  • 您确实已经声明了 EditText:EditText m,m1,m2,m3,m00,m11,m22,m33;从带有 findbyid 的行中删除 - 最后的 EditText。
  • @SergeyNeskoromny 感谢您的回复。但是当我删除这个时,我的 messageLIST 现在是错误的。带有 add(m) 和下一个的行是错误的:'变量“m”是从内部类中访问的,需要声明为 final。'
  • final EditText m = (EditText) findViewById(R.id.message); 应该是 m = (EditText) findViewById(R.id.message);,因为您在顶部声明了您的 EditText
  • 删除 - 你复制了声明。编辑文本 m,m1,m2,m3,m00,m11,m22,m33; - 在您活动的所有范围内可见!
  • @SergeyNeskoromny 谢谢。我没有看到这个错误。现在,它没有错误,但我仍然在考虑选择哪种方式保存此数据信息 SharedPreferences by button。

标签: java android arraylist sharedpreferences


【解决方案1】:

我不知道你为什么需要这样做。您可以在首选项中为所有编辑文本值保存逗号分隔的字符串。您不需要这些行..

 List<EditText> messageLIST = new ArrayList<EditText>(){{
    add(m);
    add(m1);
    add(m2);
    add(m3);
    add(m00);
    add(m11);
    add(m22);
    add(m33);
}};
for(int i = 0; i < messageLIST.size(); i++)
{
    messageLIST.get(i);
}

就这样做

在每个编辑文本上调用 getText.toString() 并将其附加到其他值,然后将其保存在您偏好的键中

【讨论】:

  • 但在名为 saveButton 的函数中,我需要调用相同数量的变量。我以前试过这个,但我在将数据存储到一个存储它的变量时遇到了问题。
  • 你在做什么。在这种情况下,您只是在消耗内存。您正在创建一个没有用的额外 Collection。您需要的只是每个编辑文本中的文本..
【解决方案2】:

我建议您创建一个Map&lt;String, EditText&gt;()。使用put("Your key value", yourEditText) 将所有EditText 添加到Map。当您想将其存储到 SharedPreferences 时,请执行以下操作:

 SharedPreferences sharedPreferences = getApplication().getSharedPreferences(MY_PREFS_NAME, MODE_PRIVATE);
 SharedPreferences.Editor editor = sharedPreferences.edit();
 for(Map.Entry<String, EditText> entry : map.entrySet()){
    editor.putString(entry.getKey(), entry.getValue().getText().toString();
 }
 editor.commit();

【讨论】:

    【解决方案3】:

    在for循环中,你可以创建一个json字符串并保存到sharedprefs中,比如;

    public void saveToSharedPrefs(List<EditText> messageLIST) {
    
        JSONArray jsonArrayParent = new JSONArray();
    
        for (int i = 0; i < messageLIST.size(); i++) {
    
            String str = messageLIST.get(i).getText().toString().trim();
    
            try {
                JSONObject jsonChid = new JSONObject();
                jsonChid.put("key", str);
                jsonArrayParent.put(jsonChid.toString());
            } catch (JSONException e) {
                e.printStackTrace();
            }
        }
    
        SharedPreferences sharedPreferences = getApplication().getSharedPreferences(MY_PREFS_NAME, MODE_PRIVATE);
        SharedPreferences.Editor editor = sharedPreferences.edit();
        editor.putString("numberValue", jsonArrayParent.toString());
        editor.commit();
    }
    

    并在您的 saveButton 方法中调用此方法,如

    public void saveButton(View view) {
        Intent intent = new Intent(this, MainActivity.class);
        saveToSharedPrefs(messageLIST);
        startActivity(intent);
    }
    

    【讨论】:

    • 它在 Android Studio 中无法正常工作。我必须通过这样的程序建议来编辑它: JSONArray jsonArrayParent = new JSONArray(); for(int i = 0; i
    • 抱歉,@gryzek,你能用编辑过的块再试一次吗?
    • 现在,它没有任何错误。但是现在,如何在按钮功能中使用这个来保存输入的数据?
    • 再次编辑答案@gryzek,将 messageLIST 声明为您班级中的全局对象。
    • 我做了你说的@dgngulcan,但它不起作用。当我运行它时,它无需保存即可工作。对于一个变量,我使用“editor.commit”来保存数据。在行
    • messageLIST
    猜你喜欢
    相关资源
    最近更新 更多
    热门标签