IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Android Discussion :

Bonne méthode pour afficher/stocker de longs textes


Sujet :

Android

  1. #1
    Membre habitué
    Inscrit en
    Novembre 2010
    Messages
    154
    Détails du profil
    Informations forums :
    Inscription : Novembre 2010
    Messages : 154
    Points : 130
    Points
    130
    Par défaut Bonne méthode pour afficher/stocker de longs textes
    Bonjour,

    J'ai une application composée de différentes activity composées de textes longs. J'utilise strings.xml pour stocker les textes.
    Mais si je continue ainsi, je vais avoir un fichier strings.xml énooorme et je suis sûr qu'il existe une meilleure solution.

    Quelle est la meilleure méthode pour afficher de longs textes (découpés en chapitres comme un livre) et où stocker ces longs textes ?

    Merci d'avance

  2. #2
    Membre habitué Avatar de cad13
    Homme Profil pro
    Inscrit en
    Janvier 2010
    Messages
    247
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 247
    Points : 197
    Points
    197
    Par défaut
    Personnellement, j'utiliserais des fichiers texte...

  3. #3
    Membre habitué
    Inscrit en
    Novembre 2010
    Messages
    154
    Détails du profil
    Informations forums :
    Inscription : Novembre 2010
    Messages : 154
    Points : 130
    Points
    130
    Par défaut
    Citation Envoyé par cad13 Voir le message
    Personnellement, j'utiliserais des fichiers texte...
    ok. merci pour m'avoir mis sur cette voie
    j'ai crée un fichier texte.txt dans le dossier assets
    mais je ne réussis pas à l'afficher dans mon activity

    J'ai recherché dans google et trouvé quelques pistes avec bufferefreader et inputstream mais sans réussir... pour le moment.
    Suis-je sur la bonne voie ?

  4. #4
    Rédacteur
    Avatar de MrDuChnok
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2002
    Messages
    2 112
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 112
    Points : 4 240
    Points
    4 240
    Par défaut
    Si tu veux que ton application soit multilingues assez simplement, garde le principe du string.xml .
    Si toutefois le fichier d'installation (apk) est trop grand, une autre solution serait de placer tes grosses ressources sur internet. Et de récupérer ses ressources via un serveur à la première initialisation de ton application.

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    8
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Octobre 2010
    Messages : 8
    Points : 5
    Points
    5
    Par défaut
    voici un bout de code si tu veux lire ligne par ligne ton fichier texte

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    try {
             //IMPORTANT : Ouverture spécifique d'un fichier en Android 
          BufferedReader entree = new BufferedReader(new InputStreamReader(R.this.getAssets().open("ton_fichier.txt")));  
    					 
    //Exemple d'utilisation du fichier avec une BufferedReader --> classique en Java 
                 //lecture de la première ligne
    	String ligne = entree.readLine();
          do{
                //Affiche la ligne récupéré
    	textView.setText(ligne);	
    	//Lecture de la ligne suivante
    	ligne=entree.readLine();
             }
             //Tant que l'on est pas a la fin du fichier
             while(ligne!=null); 
          } 
    catch (IOException e) {
    		e.printStackTrace();
    		}

  6. #6
    Membre habitué
    Inscrit en
    Novembre 2010
    Messages
    154
    Détails du profil
    Informations forums :
    Inscription : Novembre 2010
    Messages : 154
    Points : 130
    Points
    130
    Par défaut
    Citation Envoyé par MrDuChnok Voir le message
    Si tu veux que ton application soit multilingues assez simplement, garde le principe du string.xml .
    Si toutefois le fichier d'installation (apk) est trop grand, une autre solution serait de placer tes grosses ressources sur internet. Et de récupérer ses ressources via un serveur à la première initialisation de ton application.
    Excellente idée. Je regarde comment faire et je découvre URLConnection + InputStream + convertir le HTML en CharSequence intégrable dans une TextView.

    Ça fait du boulot, mais je me lance

  7. #7
    Membre habitué
    Inscrit en
    Novembre 2010
    Messages
    154
    Détails du profil
    Informations forums :
    Inscription : Novembre 2010
    Messages : 154
    Points : 130
    Points
    130
    Par défaut
    Citation Envoyé par matleb Voir le message
    voici un bout de code si tu veux lire ligne par ligne ton fichier texte

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    try {
             //IMPORTANT : Ouverture spécifique d'un fichier en Android 
          BufferedReader entree = new BufferedReader(new InputStreamReader(R.this.getAssets().open("ton_fichier.txt")));  
    					 
    //Exemple d'utilisation du fichier avec une BufferedReader --> classique en Java 
                 //lecture de la première ligne
    	String ligne = entree.readLine();
          do{
                //Affiche la ligne récupéré
    	textView.setText(ligne);	
    	//Lecture de la ligne suivante
    	ligne=entree.readLine();
             }
             //Tant que l'on est pas a la fin du fichier
             while(ligne!=null); 
          } 
    catch (IOException e) {
    		e.printStackTrace();
    		}
    Merci.

  8. #8
    Membre habitué
    Inscrit en
    Novembre 2010
    Messages
    154
    Détails du profil
    Informations forums :
    Inscription : Novembre 2010
    Messages : 154
    Points : 130
    Points
    130
    Par défaut
    J'ai crée un fichier texte.txt que j'ai mis dans assets.
    Par contre mon code a un (ou plusieurs soucis) et je ne sais pas résoudre cela.

    Code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    package com.formation.cor;
     
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import android.app.Activity;
    import android.os.Bundle;
    import android.widget.TextView;
     
     
     
    public class Hud extends Activity {
    	private static TextView textView;
     
    		public void onCreate(Bundle savedInstanceState) {
    			super.onCreate(savedInstanceState);
    			//on associe le layout
    			setContentView(R.layout.hud);
     
    				try {
    					//IMPORTANT : Ouverture spécifique d'un fichier en Android 
    					BufferedReader entree = new BufferedReader(new InputStreamReader(this.getAssets().open("texte.txt")));  
     
    					//Exemple d'utilisation du fichier avec une BufferedReader --> classique en Java 
    		            //lecture de la première ligne
    					String ligne = entree.readLine();
     
    					do{
    						//Affiche la ligne récupérée
    						textView.setText(ligne);	
    						//Lecture de la ligne suivante
    						ligne=entree.readLine();
    						}
    						//Tant que l'on est pas a la fin du fichier
    						while(ligne!=null); 
    					} 
    						catch (IOException e) {
    						e.printStackTrace();
    						}
     
    		}
     
    }
    Le logcat me dit pleins de choses que je ne sais pas déchiffrer:
    11-24 01:59:33.473: WARN/ActivityManager(68): Activity destroy timeout for HistoryRecord{44010d00 com.formation.cor/.Main}
    11-24 01:59:33.486: WARN/ActivityManager(68): Activity destroy timeout for HistoryRecord{43ec2910 com.formation.cor/.Hud}
    11-24 02:03:10.115: DEBUG/SntpClient(68): request time failed: java.net.SocketException: Address family not supported by protocol

    Si quelqu'un voit mon erreur, je lui en serais très reconnaissant

  9. #9
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    8
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Octobre 2010
    Messages : 8
    Points : 5
    Points
    5
    Par défaut
    Je pense que ton erreur vient de ton "this.getAssets().open" met "R.this.getAssets().open" à la place

  10. #10
    Membre habitué
    Inscrit en
    Novembre 2010
    Messages
    154
    Détails du profil
    Informations forums :
    Inscription : Novembre 2010
    Messages : 154
    Points : 130
    Points
    130
    Par défaut
    Ça me donne 2 erreurs d'un coup sur la même ligne:
    - No enclosing instance of the type R is accessible in scope
    - The method getAssets() is undefined for the type R

  11. #11
    Expert éminent

    Avatar de Feanorin
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    4 589
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 4 589
    Points : 9 149
    Points
    9 149
    Par défaut
    Salut,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    getResources().getAssets().open("texte.txt");

  12. #12
    Membre habitué
    Inscrit en
    Novembre 2010
    Messages
    154
    Détails du profil
    Informations forums :
    Inscription : Novembre 2010
    Messages : 154
    Points : 130
    Points
    130
    Par défaut
    Citation Envoyé par Feanorin Voir le message
    Salut,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    getResources().getAssets().open("texte.txt");
    Génial je n'ai plus aucune erreur.
    Par contre lorsque j'ouvre l'application et que je clic sur l'item de la listview qui doit ouvrir l'activity hud elle se ferme de suite avec le message d'erreur "Sorry. The application has stopped unexpectedly. Please try again."

    Je dois ajouter une autorisation dans le manifest pour ouvrir un fichier texte ?

  13. #13
    Expert éminent

    Avatar de Feanorin
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    4 589
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 4 589
    Points : 9 149
    Points
    9 149
    Par défaut
    Tu as quoi comme erreur dans le logcat ?

  14. #14
    Membre habitué
    Inscrit en
    Novembre 2010
    Messages
    154
    Détails du profil
    Informations forums :
    Inscription : Novembre 2010
    Messages : 154
    Points : 130
    Points
    130
    Par défaut
    Voici mon logcat:

    11-26 20:56:25.885: INFO/ActivityManager(67): Starting activity: Intent { cmp=com.formation.cor/.Hud }
    11-26 20:56:26.012: DEBUG/AndroidRuntime(305): Shutting down VM
    11-26 20:56:26.022: WARN/dalvikvm(305): threadid=1: thread exiting with uncaught exception (group=0x4001d800)
    11-26 20:56:26.052: ERROR/AndroidRuntime(305): FATAL EXCEPTION: main
    11-26 20:56:26.052: ERROR/AndroidRuntime(305): java.lang.Error: Unresolved compilation problems:
    11-26 20:56:26.052: ERROR/AndroidRuntime(305): No enclosing instance of the type R is accessible in scope
    11-26 20:56:26.052: ERROR/AndroidRuntime(305): The method getAssets() is undefined for the type R
    11-26 20:56:26.052: ERROR/AndroidRuntime(305): at com.formation.cor.Hud.onCreate(Hud.java:22)
    11-26 20:56:26.052: ERROR/AndroidRuntime(305): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
    11-26 20:56:26.052: ERROR/AndroidRuntime(305): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2627)
    11-26 20:56:26.052: ERROR/AndroidRuntime(305): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679)
    11-26 20:56:26.052: ERROR/AndroidRuntime(305): at android.app.ActivityThread.access$2300(ActivityThread.java:125)
    11-26 20:56:26.052: ERROR/AndroidRuntime(305): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033)
    11-26 20:56:26.052: ERROR/AndroidRuntime(305): at android.os.Handler.dispatchMessage(Handler.java:99)
    11-26 20:56:26.052: ERROR/AndroidRuntime(305): at android.os.Looper.loop(Looper.java:123)
    11-26 20:56:26.052: ERROR/AndroidRuntime(305): at android.app.ActivityThread.main(ActivityThread.java:4627)
    11-26 20:56:26.052: ERROR/AndroidRuntime(305): at java.lang.reflect.Method.invokeNative(Native Method)
    11-26 20:56:26.052: ERROR/AndroidRuntime(305): at java.lang.reflect.Method.invoke(Method.java:521)
    11-26 20:56:26.052: ERROR/AndroidRuntime(305): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
    11-26 20:56:26.052: ERROR/AndroidRuntime(305): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
    11-26 20:56:26.052: ERROR/AndroidRuntime(305): at dalvik.system.NativeStart.main(Native Method)
    11-26 20:56:26.083: WARN/ActivityManager(67): Force finishing activity com.formation.cor/.Hud
    11-26 20:56:26.103: WARN/ActivityManager(67): Force finishing activity com.formation.cor/.Main
    11-26 20:56:26.602: WARN/ActivityManager(67): Activity pause timeout for HistoryRecord{43fe3da0 com.formation.cor/.Hud}

  15. #15
    Expert éminent

    Avatar de Feanorin
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    4 589
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 4 589
    Points : 9 149
    Points
    9 149
    Par défaut
    J'ai trouvé ça

    On dirait bien que tes assets ne sont pas dans ton fichier ressource R

    http://www.androidbook.com/akc/displ...&reportId=2883

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    AssetManager am = getAssets();
    		InputStream is = am.open("test.txt");
    D'après ce que j'ai lu aussi tu peux lister tes assets
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    String[] list = getAssets().list("");

  16. #16
    Membre habitué
    Inscrit en
    Novembre 2010
    Messages
    154
    Détails du profil
    Informations forums :
    Inscription : Novembre 2010
    Messages : 154
    Points : 130
    Points
    130
    Par défaut
    Après m'être arraché quelques cheveux j'avance petit à petit et ô surprise mon fichier vient de s'afficher

    Qu'ai-je fait ?
    ajouter "textView = (TextView)findViewById(R.id.tvContent);" dans mon activity
    textView étant l'id du TextView de mon xml

    Et là le texte de mon fichier texte.txt situé dans assets s'est affiché. Yes
    Merci beaucoup à tous pour votre aide.

    Par contre la résolution d'un problème engendre souvent un autre problème.

    Mon fichier texte est composé d'une centaine de ligne avec des retours chariot. Et dans l'mulateur seule la dernière ligne apparait. Je dois enlever les retour chariot pour afficher toutes les lignes. Pas très pratique dans eclipse d'avoir tout mon texte sur une seule ligne. Et pas très lisible sur l'émulateur car les retour à la ligne ne sont pas aux endroits voulus.
    J'ai tenté de mettre des fichiers xml, html, php dans assets mais le soucis est le même et les balises comme <br /> ou <li> ne sont pas prises en compte.

    Existe-t-il une solution pour faire la mise en page d'un fichier texte sans découper le fichier en 100 textview ?
    Faut-il que je passe à l'étape suivante: récupérer les données d'un bdd ?

Discussions similaires

  1. Réponses: 5
    Dernier message: 23/04/2008, 15h41
  2. Réponses: 2
    Dernier message: 22/08/2006, 08h28
  3. Réponses: 20
    Dernier message: 27/06/2006, 17h42
  4. Réponses: 2
    Dernier message: 04/06/2006, 18h53
  5. [SWING][THREAD]Méthodes pour afficher une Frame
    Par pompidouwa dans le forum Agents de placement/Fenêtres
    Réponses: 3
    Dernier message: 05/05/2004, 10h35

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo