Précédent   Forum des professionnels en informatique > Java > Général Java > Java & Mobiles > Android
Android Forum d'entraide sur Android, la plateforme mobile de Google pour téléphones portables et Smartphones. Avant de poster -> FAQ Android
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 07/02/2012, 23h07   #1
Invité de passage
 
Homme
Inscription : août 2011
Messages : 7
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations forums :
Inscription : août 2011
Messages : 7
Points : 3
Points : 3
Par défaut Modification d'un TextView à partir d'une autre classe

Bonjour à tous,
ça va faire 2 jours que je cherche mais sans réel succès. Mon but est d'essayer de mettre à jour une TextView à partir d'une autre classe.

Dans mon projet, j'ai 2 fichiers : le fichier principal contenant la fonction onCreate() et le second fichier est un fichier Log.

Toutes les fonctions de mon fichier Log sont "static". A partir de la fonction onCreate, j'appelle par exemple "Log.Info("Bonsoir !");"

Ma classe Log va écrire dans un fichier "[INFO]: Bonsoir !". Jusque là, pas de problème, mais j'aimerai que lorsque le programme écrit dans le fichier .log suite aux appels de Log.*, il y ait une mise à jour sur l'interface graphique du téléphone, plus particulièrement dans la TextView.

Pour que l'on s'y retrouve mieux, voici la partie du code onCreate (la seule fonction de mon 1er fichier) :
Code :
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
import android.app.Activity;
import android.os.Bundle;
import android.os.Environment;
import android.widget.LinearLayout;
import android.widget.TextView;
import java.io.*;
 
public class TestActivity extends Activity {
 
	LinearLayout layout = null;
	static TextView result = null;
 
 
    @Override
    public void onCreate(Bundle savedInstanceState) 
    {
    	File _fileName = new File(Environment.getExternalStorageDirectory(), "File.log");
    	Log.Init(_fileName.toString());
    	Log.Info("Bonsoir !");
 
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
 
        result = (TextView)this.findViewById(R.id.log);
        result.setText("Window Log:\n");
    }
Voici ma fonction Info() du 2ème fichier :
Code :
1
2
3
4
public static void Info(String Message)
	{
		Write(Message, Levels.Info);
	}
Suivi de la fonction Write() toujours issue du 2ème fichier :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
private static void Write(String Message, Levels lvl) 
	{		
		switch(lvl)
		{		
			case Info:
			{
                                /*C'est ici qu'il faudrait que je puisse envoyer
                                   le message pour mettre à jour la TextView*/
				try 
				{
					fs.write("[INFO]: " + Message + "\n");
					fs.flush();
				} 
				catch (IOException e) 
				{
 
				}
			}
			break;
                }
}
Voilà, j'ai déjà cherché un peu partout, beaucoup en parle mais je n'ai pas vraiment trouvé de solution surtout que j'utilise des fonctions "static", je ne sais pas si cela pose vraiment problème.

Je vous remercie d'avance pour votre aide,

Bonsoir !
lea436 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/02/2012, 14h17   #2
Modérateur
 
Homme Nicolas Romantzoff
Ingénieur systèmes et réseaux
Inscription : février 2007
Messages : 1 242
Détails du profil
Informations personnelles :
Nom : Homme Nicolas Romantzoff
Localisation : France, Rhône (Rhône Alpes)

Informations professionnelles :
Activité : Ingénieur systèmes et réseaux
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : février 2007
Messages : 1 242
Points : 1 806
Points : 1 806
Envoyer un message via Skype™ à nicroman
Un petit probleme de conception ?

Tu as deux "objets" (même n'a que des fonctions statiques) qui doivent communiquer entre eux: l'activité doit pouvoir appeler Log, et Log doit pouvoir appeler l'activité (le TextView)... Il y a plusieurs possibilités:

1. Créer un objet "Log" qui peut prendre un text-view en paramètre, et le déclarer comme "currentLog".
Exemple:
Code :
1
2
3
4
5
6
7
 
   // Dans le onResume de l'activité:
   TextView tv = (TextView) findViewById(...);
   this.log = Log.enterLog(tv);
 
   // Dans le onPause de l'actvité
   Log.exitLog(this.log);
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
 
   public class Log
   {
         static LinkedList<Log>  logList = new LinkedList<Log>();
 
         static public Log  enterLog(TextView tv) {
             Log ret = new Log(tv);
             logList.add(ret,0);
             return ret;
         }
         static public void exitLog(Log log) {
             logList.remove(log);
         }
 
        static write(....) {
             for (Log l : logList) {
                  if (l.getTextView() != null) 
                      l.getTextView().setText(message);
             }
        }
   }
2. Implémenter le schema habituel complet: producer/processor/consumer (et le code va ressembler à Log4j au final):
Un objet "Logger" qui va te permettre de logger les évenements, (fonctions info, warn, ...) et de maintenir une liste de "LogOutput" (interface prenant en paramètres toutes les informations du logger). On peut avoir 3 implémentations de LogOutput:
* TextViewOutput (qui prend un TextView, et le met à jour)
* FileLogOutput (qui écrit dans un fichier)
* AndroidLogOutput (qui utilise le systeme fourni avec Android pour les logs).



NB: La règle en Java: Une majuscule en début d'identifiant dénote un TYPE (une classe, enum, etc...) jamais une fonction ou une variable.

Les fonctions devraient donc être "info" (et non Info) et "write" (et non Write)
nicroman est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/02/2012, 20h42   #3
Invité de passage
 
Homme
Inscription : août 2011
Messages : 7
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations forums :
Inscription : août 2011
Messages : 7
Points : 3
Points : 3
Merci de ta réponse nicroman !

J'ai testé la solution n°1 car je compte bien garder ma classe "Log". Malheureusement, dû à une incompréhension de ma part, je n'arrive pas à comprendre ce que fait ton code.

En plus, les appels à la classe Log ne se limitent pas à la classe "TestActivity" mais Log peut aussi être appelé depuis d'autres classes et c'est pour cela que je recherche absolument à pouvoir mettre à jour ma TextView depuis la classe Log.

J'ai tout de même continué à rechercher de mon côté et j'ai besoin d'une précision : j'ai créé une fonction insertMessage (String Message) dans ma classe principale.
Je l'ai appelé depuis onCreate mais rien à faire, impossible de mettre à jour la TextView. Voici le code d'insertMessage :

Code :
1
2
3
4
public void insertMessage(String Message)
{
    result.setText(Message);
}
Je ne comprends pas pourquoi avec cette simple fonction, ça déconne... Pourtant on est toujours dans le Thread principal (le seul où l'on peut changer l'UI).

Après, j'ai aussi lu que certains se servaient de AsynkTask. Est-ce valable pour ce que je souhaite faire ?

Merci d'avance pour vos réponses.

Bonne soirée.
lea436 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 20h54.


 
 
 
 
Partenaires

Hébergement Web