Je développe une application pour Android.

J'ai beaucoup de variables de type EditText. Je souhaite utiliser un Button pour enregistrer les données saisies par l'utilisateur. Le problème commence lorsque j'essaye de mettre chaque EditText un par un. J'ai donc pensé à utiliser un ArrayList. J'ai lu que je ne peux pas mettre un ArrayList directement dans SharedPreferences. Mais quelle est la meilleure façon de procéder? Utilisez un hachage, sérialisable ou un par un? Je suis un débutant, donc je ne sais pas quelle est la meilleure solution - cela signifie plus facile à utiliser mais plus longtemps.

Dans ce cas que j'ai essayé dans une variable ("m" seulement) mais quand je clique sur un bouton pour l'enregistrer, il sort de l'application.

Comment puis-je améliorer ce code pour qu'il fonctionne correctement?

Voici le code:

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

    }
}
0
gryzek 4 janv. 2016 à 16:33

3 réponses

Meilleure réponse

Je n'ai aucune idée de la raison pour laquelle vous devez faire cela. Vous pouvez simplement enregistrer la chaîne séparée par des virgules pour toutes vos valeurs de texte d'édition dans les préférences. Vous n'avez pas besoin de ces lignes.

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

Fais juste ça

Appelez getText.toString () sur chaque texte d'édition et ajoutez-le par une autre valeur, puis enregistrez-le dans une clé selon vos préférences

0
ADM 4 janv. 2016 à 13:45

Je vous recommande de créer un Map<String, EditText>(). Ajoutez tous vos EditText au Map en utilisant put("Your key value", yourEditText). Lorsque vous souhaitez le stocker pour SharedPreferences, procédez comme suit:

 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();
0
Evgeniy Mishustin 4 janv. 2016 à 13:49

Dans la boucle for, vous pouvez créer une chaîne json et l'enregistrer dans les sharedprefs comme;

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

Et appelez cette méthode dans votre méthode saveButton comme

public void saveButton(View view) {
    Intent intent = new Intent(this, MainActivity.class);
    saveToSharedPrefs(messageLIST);
    startActivity(intent);
}
0
dgngulcan 4 janv. 2016 à 14:19