EditText Android, sauvegarder le champ ?

Shidy06 -  
sandul Messages postés 4013 Statut Membre -
Bonjour,

Etant en plein apprentissage de la programmation pour Android, j'utilise Eclipse Helios.

J'ai un souci concernant un EditText.

Le principe (du moins ce que j'aimerais faire), c'est que ce qui est inscrit dans cet EditText soit enregistrer à l'aide d'un clic sur bouton en dessous sur la carte mémoire.
De telle sorte à pouvoir consulter le contenu plus tard au format TextView.

Le problème c'est que je ne trouve pas de tuto sur cette idée la, le principe d'un bloc notes finalement. Ecrire du texte, l'enregistrer et le consulter ultérieurement.

Merci d'avance !
A voir également:

19 réponses

Shidy06
 
Aucun soucis !

Bon actuellement j'en suis à là grâce à ta réponse rapide :)

String filename = "text";
String string = "text";

FileOutputStream fos = openFileOutput(FILENAME, Context.MODE_PRIVATE);
fos.write(string.getBytes());
fos.close();


Pour les "text" définis sur les deux premières lignes, je suppose que ça n'a rien à faire la compte tenu de mon projet.

Pour info histoire que vous ayez plus de cartes en mains, les deux EditText sont dans mon main.xml, comme ceci :

   		<EditText
   			android:layout_width="fill_parent"
   			android:layout_height="50dip"
   			android:scrollbars="vertical"
   			android:id="@+id/editText1"/>

   		        <EditText
   			android:layout_width="fill_parent"
   			android:layout_height="fill_parent"
   			android:scrollbars="vertical"
   			android:id="@+id/editText2"
   			/>


Après y'a FILENAME qui est affiché comme erreur (l3) , puis Context. pour lequel je me demande si ça doit rester comme ça ou si je dois l'adapter au projet ?

Merci !
1
sandul Messages postés 4013 Statut Membre 723
 
Salut,

Si je ne me trompe, ça enregistre automatiqument non seulement le texte, mais aussi la position du curseur... Rien à faire, donc.

++
0
jams
 
Salut,

Tu dois mettre un listener sur ton bouton (OnClickActionListener ou quelque chose comme ca). A l'intérieur, il faut tout simplement faire une sauvegarde de ton texte dans la carte mémoire (cherche sur google "save file android").

Si c'est trop abstrait n'hésite pas a demander.
0
Shidy06
 
Ah :)

Sachant que typiquement j'ai deux champs EditText à sauvegarder (un définissant le titre du document, l'autre son contenu).

Donc si je comprends bien, pour sauvegarder le contenu, je m'y prends un peu comme quand j'avais souhaité affiché un pop-up (toast) lors du click sur ce fameux bouton de sauvegarde ?

Le toast fonctionne comme ceci :
OnClickListener my_listener1 = new OnClickListener(){
	public void onClick(View v){
		Toast saved_message = Toast.makeText(Notepad_fr.this, "NotePad FR enregistré.", 1);
		saved_message.show();
	}
};

final Button save_button = (Button) findViewById(R.id.button1);
save_button.setOnClickListener(my_listener1);


Bon a la limite pour le listener je devrais m'en sortir. Par contre j'ai été voir sur Google, pour ce qui est de la sauvegarde de données sur la mémoire du téléphone, j'ai eu cet exemple la :
String filename = "hello_file";
String string = "hello world!"; string = "Bonjour tout le monde!";

FileOutputStream fos = openFileOutput(FILENAME, Context.MODE_PRIVATE); FileOutputStream fos = openFileOutput (FILENAME, Context.MODE_PRIVATE);
fos.write(string.getBytes()); fos.write (string.getBytes ());
fos.close(); fos.close ();


Mais j'ai pas mal d'erreurs en l'entrant, j'pense bien qu'il y ai des choses à adapter mais quoi ? :D

Merci pour l'aide en tout cas !
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
sandul Messages postés 4013 Statut Membre 723
 
Re,

Pardon pour mon 1er post, j'avais mal lu ce que tu voulais faire. J'ai cru que tu voulais faire une sauvegarde de ton texte entre 2 sessions, ce qui n'est pas nécessaire (Android s'en occupe).

String string = "hello world!"; string = "Bonjour tout le monde!";
==> corrige cette double déclaration déjà. Idem pour le fos (supprime une ligne). Et idem pour les appels write() et close().

++
0
sandul Messages postés 4013 Statut Membre 723
 
Après y'a FILENAME qui est affiché comme erreur (l3) , puis Context. pour lequel je me demande si ça doit rester comme ça ou si je dois l'adapter au projet ?

==> il faut remplacer FILENAME par un vrai nom de fichier (filename, par exemple, que tu as déclaré plus haut). Et pour Context, il faut l'importer:

import android.content.Context;

++
0
Shidy06
 
Exact, désolé pour le Context... je l'avais importé en plus :/

Donc on en arrive à la du coup :

String filename = "title";
String string = "text";

FileOutputStream fos = null;
try {
	fos = openFileOutput(filename, Context.MODE_PRIVATE);
} catch (FileNotFoundException e) {
	e.printStackTrace();
}
try {
	fos.write(string.getBytes());
} catch (IOException e) {
	e.printStackTrace();
}
try {
	fos.close();
} catch (IOException e) {
	e.printStackTrace();
}


La, pas d'erreurs.

Maintenant, je suppose qu'il faut définir le filename comme étant le contenu de l'EditText ?
0
sandul Messages postés 4013 Statut Membre 723
 
Oui, tout à fait. Si un des EditText contient le nom du fichier et l'autre le texte à sauvegarder, il te faut qqchose qui ressemble à ceci:

EditText fileET = (EditText) findViewById(R.id.editText1); // editText1 contient le nom du fichier
String filename = fileET.getText().toString();
		
		
EditText contentET = (EditText) findViewById(R.id.editText2); // editText2 contient le contenu à sauvegarder
String string = contentET.getText().toString();
0
Shidy06
 
Ah en effet ! Simple finalement. Merci beaucoup !

Par contre Eclipse veux que je renomme filename et string. Un oubli ?
0
sandul Messages postés 4013 Statut Membre 723
 
Hum, je ne puis vérifier car pas d'Eclipse devant mes yeux... Mais pourquoi renommer ? Quel est le contenu exact du warning ?
0
Shidy06
 
Nan en fait erreur de ma part, j'avais laissé des codes en trop.

Bon je lance l'appli, elle crash. Je te résume la page java, parce que je me demande si je dois pas créer une nouvelle classe du coup :

package com.shidy06.notepad_fr;

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

public class Notepad_fr extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
//Toast affiché au clic sur le bouton 1        
OnClickListener my_listener1 = new OnClickListener(){
	public void onClick(View v){
		Toast saved_message = Toast.makeText(Notepad_fr.this, "NotePad FR enregistré.", 1);
		saved_message.show();
	}
};
//Référence du Toast précédent
final Button save_button = (Button) findViewById(R.id.button1);
save_button.setOnClickListener(my_listener1);

//Bouton pour quitter l'application
((Button) findViewById(R.id.button3)).setOnClickListener(new OnClickListener(){
	@Override
	public void onClick(View v){
		Notepad_fr.this.finish() ;	
	}
});

//Bouton pour aller dans les Notepad sauvegardés
Button button4 = (Button) findViewById(R.id.button2);
button4.setOnClickListener(new View.OnClickListener(){
	public void onClick(View v){
		Intent i = new Intent(Notepad_fr.this, Notepad_fr_saved.class);
		startActivity(i);
		Notepad_fr.this.finish() ;
	}
});

EditText fileET = (EditText) findViewById(R.id.editText1);
String filename = fileET.getText().toString();

EditText contentET = (EditText) findViewById(R.id.editText2);
String string = contentET.getText().toString();

FileOutputStream fos = null;
try {
	fos = openFileOutput(filename, Context.MODE_PRIVATE);
} catch (FileNotFoundException e) {
	e.printStackTrace();
}
try {
	fos = openFileOutput(string, Context.MODE_PRIVATE);
} catch (FileNotFoundException e) {
	e.printStackTrace();
}
try {
	fos.write(string.getBytes());
} catch (IOException e) {
	e.printStackTrace();
}
try {
	fos.close();
} catch (IOException e) {
	e.printStackTrace();
}
    }
}

0
sandul Messages postés 4013 Statut Membre 723
 
As-tu rajouté les permissions dans le fichier manifest ?

A plus, je vais mangeailler, bon app !
0
Shidy06
 
Hm... non.

Donc c'est part pour le manifest !

Par contre, comment procéder parce que je t'avoue que c'est flou pour moi !

Bon ap', j'vais faire de même :)
0
sandul Messages postés 4013 Statut Membre 723
 
Re,

Je ne suis pas sûr en fait s'il te faut une permission pour sauvegarder sur la mémoire interne (comme tu le fais). Pour les permissions, c'est par ici: https://developer.android.com/reference/android/Manifest.permission.html et il faut rajouter une permission de type WRITE_EXTERNAL_STORAGE si tu veux utiliser la carte SD.

Ton code plante pour des raisons différentes, par contre... regarde ce que ça donne après une tite réorganisation (déplacement du code vers le listener du bouton button1):

package com.shidy06.notepad_fr;

import java.io.FileOutputStream;
import java.io.IOException;

import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

public class Notepad_fr extends Activity {
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);

		final Button save_button = (Button) findViewById(R.id.button1);
		save_button.setOnClickListener(new OnClickListener() {
			public void onClick(View v) {
				FileOutputStream fos = null;

				EditText contentET = (EditText) findViewById(R.id.editText2);
				String string = contentET.getText().toString();

				EditText fileET = (EditText) findViewById(R.id.editText1);
				String filename = fileET.getText().toString();

				try {
					fos = openFileOutput(filename, Context.MODE_PRIVATE);

					fos.write(string.getBytes());
					
					Toast saved_message = Toast.makeText(Notepad_fr.this,
							"NotePad FR enregistré.", 1);
					saved_message.show();
				} catch (Exception e) {
					Log.e("Sudoku", e.getMessage());
				} finally {
					try {
						fos.close();
					} catch (IOException e) {
					}
				}
			}
		});
	}
}

0
Shidy06
 
Re !

Alors écoute le code est parfait ! Erreur donc à cause des permissions mais j'ai ajouté WRITE_EXTERNAL_STORAGE et tout ce passe comme sur des roulettes !

Prochaine étape, utiliser un second bouton pour pouvoir accéder aux fichiers sauvegardés sous forme de list (ListVIew !)

Sachant que j'ai une deuxième activité et un XML layout déjà pret pour ça !

Merci beaucoup pour ton aide !
0
sandul Messages postés 4013 Statut Membre 723
 
Fais un premier jet du code et poste-le... Vais essayer d'y jeter un coup d'oeil, mais je ne promets rien.

Dans un autre ordre d'idées: tu as ici 11 tits tutos pas mal http://www.xtensivearts.com/topics/tutorials/ et s'il s'agit de bouquins, je te recommande chaleureusement de commencer par Hello Android d'Ed Burnette: https://www.amazon.com/Hello-Android-Introducing-Development-Programmers/dp/1934356565/ref=sr_1_2?s=books&ie=UTF8&qid=1282656185&sr=1-2

++
0
Shidy06
 
Le site de tutos que tu m'as donné est plutôt sympa, voila sûrement ce dont j'ai besoin. Parce que des tutos android, tu trouve 40 helloworld, mais après dès que tu veux faire un peu plus t'es laché dans la jungle.

Je regarde ça, je compile et je reposte !

Merci !
0
Shidy06
 
Mon deuxieme code est la :

package com.shidy06.notepad_fr;

import java.util.ArrayList;
import java.util.List;

import android.app.Activity;
import android.app.ListActivity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ListView;

public class Notepad_fr_saved extends ListActivity {
	
	@Override
	public void onCreate(Bundle savedInstanceState){
		super.onCreate(savedInstanceState);
		setContentView(R.layout.savelist);
		
		//Liste des sauvegardes
		ListView notePadList;
		notePadList = (ListView) findViewById(R.id.liste1);
		String[] titles = {
				"France","USA"};
		ArrayAdapter<String> adapter;
		adapter = new ArrayAdapter<String>(
				this,
				android.R.layout.activity_list_item,
				titles);
		setListAdapter(adapter);




	//Bouton pour retourner à l'accueil
	Button button4 = (Button) findViewById (R.id.button4);
	button4.setOnClickListener(new OnClickListener(){
		public void onClick(View v){
			
			Intent i = new Intent(Notepad_fr_saved.this, Notepad_fr.class);
			startActivity(i);
			Notepad_fr_saved.this.finish();
		}
	});
	}
}


J'ai suivi des tutos mais à la finale ça ne ressemble plus a rien...
"France" et "USA" sont des valeurs à titre d'exemple, elles n'ont rien a faire ici.

Ca crashouille pas mal du coup, le switch sur la page n'est plus possible !
0
sandul Messages postés 4013 Statut Membre 723
 
Un code comme

ListView notePadList = (ListView) findViewById(R.id.liste1);
String[] titles = { "France", "USA" };
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
		android.R.layout.simple_list_item_1, titles);
notePadList.setAdapter(adapter);

devrait passer.

Essaie.
0