Aller au contenu

Variable globale


android_pfe

Recommended Posts

Bonjour,

Je veux créer une variable globale pour l'utiliser partout dans mon code mais je n'arrive pas à le faire.Voilà ce que j'ai fait:

public class SMS extends Activity

{

private static int nbr ;

private static long[] tab ; // Le tableau dont j'ai besoin

.

.

.

public void onCreate(Bundle savedInstanceState)

{

nbr = Integer.parseInt(Nombre.getText().toString());

tab = new long[nbr]; // initialisation de tab

.

.

.

Ajouter.setOnClickListener( new Button.OnClickListener()

{

public void onClick(View v)

{ time= Long.parseLong( Delai.getText().toString());

tab[1]=time;

.

.

.

Il y'a aucune erreur mais l'éxecution ne se fait que si j'initialise le tableau sous public void onClick,mais je veux l'initialiser sous oncreate afin de pouvoir l'utiliser dans d'autres fonctions dans mon code.

En deux mots je veux créer un tableau et l'utiliser partout dans mon code.

Merci d'avance de votre aide.

Lien vers le commentaire
Partager sur d’autres sites

Une des méthodes que j'ai trouvé consiste à instancier une classe qui fera office de "globale":

class MyApp extends Application { 
 private int nbr ;
 private long[] tab;

 public void initTab(int nbItems){
   nbr = nbItems;
   tab = new long[nbr]; // initialisation de tab
 }

 public int getNbr(){ 
   return nbr; 
 }

 public long getItem(int pos){ 
   return tab[pos];
 }

 public void setItem(int pos, long value){
  if ((pos>0) && (pos<nbr))
    tab[pos] = value;
 }

} 


class Toto extends Activity { 
 @Override 
 public void onCreate(Bundle B){ 
   ... 
   MyApp appState = ((MyApp)getApplicationContext()); 
   appState.initTab(Integer.parseInt(Nombre.getText().toString()));

   appState.setItem(0, 1.0); // par exemple....
   ... 
 } 
}

Je vous laisse le soin de gérer proprement les exceptions/erreurs, etc...

De plus il est nécessaire de déclarer notre classe dans le manifest par l'attribut android:name=".MyApp" de la balise <application>

Par exemple:
[...]
  <application android:label="@string/app_name" android:icon="@drawable/icon" android:debuggable="true" android:name=".MyApp">
[...]

Petite précision tout de même: j'ai lu quelque part que cette classe passait à null lorsque l'on recevait un coup de fil par exemple pendant que l'application est lancée. Ca ne m'est jamais arrivé, mais c'est à creuser. On doit pouvoir gérer ça en jouant avec les OnPause/OnResume... A bon entendeur

Lien vers le commentaire
Partager sur d’autres sites

A chaque changement d'orientation, tu passes dans ton onCreate() : tu perds tout :-)

Le mieux serait un truc du style :

public class SMS extends Activity  {
  public static final  long[] tab = new long[n]
.
.
.

Si ton tableau peut changer de taille, un truc comme çà pourrait faire l'affaire :

public class SMS extends Activity  {
 public static long[] tab = null;

 public void onCreate(Bundle savedInstanceState)  {

    // 1er init du tableau
     if(savedInstanceState==null)   {
         nbr = Integer.parseInt(Nombre.getText().toString());
        tab = new long[nbr]; // initialisati
    }
    else {
        // changement d'orientation : on fait rien ?
   }
...

Ce que je fais en général, j'ai une classe (ou interface) ou je met tout les objets (globaux / statiques / accèssible partout). Afin de pas répartir çà un peut partout dans le code. Plus simple à maintenir.

Il est également possible de coder des trucs du stype :

class toto {

  public final static N = 100;
 public static long[] tab;


 // init. seulement une fois
 static {
    tab = new long[N];
 }


...

Lien vers le commentaire
Partager sur d’autres sites

Archivé

Ce sujet est désormais archivé et ne peut plus recevoir de nouvelles réponses.

×
×
  • Créer...