Java 用于共享数据引用的EditText的ArrayList

Java 用于共享数据引用的EditText的ArrayList,java,android,arraylist,sharedpreferences,Java,Android,Arraylist,Sharedpreferences,我为android开发了一个应用程序 我有很多EditText类型的变量。我想使用按钮保存用户输入的数据。当我尝试逐个放置每个EditText时,问题就开始了。 所以我考虑使用ArrayList。我读到我不能将ArrayList直接放入SharedReference。但哪种方法更好呢?使用散列、可序列化还是逐个使用?我是一个初学者,所以我不知道哪种方法更好-这意味着更容易使用,但更长的时间 在这种情况下,我尝试在一个变量(“m”只),但当我点击一个按钮保存这个,它会从应用程序中消失 如何改进此代

我为android开发了一个应用程序

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

在这种情况下,我尝试在一个变量(“m”只),但当我点击一个按钮保存这个,它会从应用程序中消失

如何改进此代码以正确工作

代码如下:

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

    }
}
公共类MainActivity扩展了ActionBarActivity{
公共静态最终字符串MY\u PREFS\u NAME=“MyPrefsFile”;
编辑文本m、m1、m2、m3、m00、m11、m22、m33;
按钮10;
SharedReferences SharedReferences;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final EditText m=(EditText)findViewById(R.id.message);
最终EditText m1=(EditText)findViewById(R.id.message1);
最终EditText m2=(EditText)findViewById(R.id.message2);
最终EditText m3=(EditText)findViewById(R.id.message3);
最终EditText m00=(EditText)findViewById(R.id.message00);
final EditText m11=(EditText)findViewById(R.id.message11);
最终EditText m22=(EditText)findViewById(R.id.message22);
最终EditText m33=(EditText)findViewById(R.id.message33);
List messageLIST=new ArrayList(){{
加(m);
加(m1);
加(m2);
增加(m3);
添加(m00);
添加(m11);
添加(m22);
增加(m33);
}};
对于(int i=0;i
在for循环中,您可以创建一个json字符串并将其保存到SharedPref中,如下所示:

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

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

 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);
}
List messageLIST=new ArrayList(){{
加(m);
加(m1);
加(m2);
增加(m3);
添加(m00);
添加(m11);
添加(m22);
增加(m33);
}};
对于(int i=0;i
就这么做吧


对每个编辑文本调用getText.toString(),并按其他值将其追加,然后将其保存在首选项的键中

我建议您创建一个
Map()
。使用
put(“您的键值”,yourEditText)
将您的所有编辑文本添加到
地图中。如果要将其存储到
SharedReferences
中,请执行以下操作:

 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();
SharedReferences SharedReferences=getApplication().GetSharedReferences(我的首选项名称,模式\私有);
SharedReferences.Editor=SharedReferences.edit();
对于(Map.Entry:Map.entrySet()){
putString(entry.getKey(),entry.getValue().getText().toString();
}
commit();

您确实已经声明了EditText:EditText m、m1、m2、m3、m00、m11、m22、m33;Remove-final EditText从findbyid行中删除。@SergeyNeskoromny感谢您的回复。但当我删除此消息时,我的消息列表现在是错误的。带有add(m)的行和下一行是错误的:'变量“m”是从内部类中访问的,需要声明为final。
final-EditText m=(EditText)findViewById(R.id.message);
应该是
m=(EditText)findViewById(R.id.message)
,因为您在顶部声明了您的
EditText
。删除并复制声明。EditText m、m1、m2、m3、m00、m11、m22、m33;-在您的所有活动范围内都可见!@SergeyNeskoromny谢谢。我没有看到这个错误。现在,它没有错误,但我仍在考虑选择哪种方式保存此数据信息SharedPre通过按钮引用。它在Android Studio中无法正常工作。我必须通过如下程序建议编辑它:JSONArray jsonArrayParent=new JSONArray();for(int I=0;I 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();