web-dev-qa-db-fra.com

Extension de l'application pour partager des variables à l'échelle mondiale

J'essaie de partager deux ArrayLists à travers les différentes activités de mon application, en utilisant le schéma expliqué ici: Comment déclarer des variables globales dans Android? .

Voici ma sous-classe d'application:

public class GlobalVars extends Application{
 ArrayList<Player> players = new ArrayList<Player>(); 
  ArrayList<String> playerNames = new ArrayList<String>();

  public ArrayList<Player> getPlayers(){
   return players;
  }

  public ArrayList<String> getPlayerNames(){
   return playerNames;
  }

  public void setPlayers(ArrayList<Player> p){
   players = p;
  }

  public void setPlayerNames(ArrayList<String> pn){
   playerNames = pn;
  }

}

Et utilisé le code:

 GlobalVars gv = (GlobalVars)getApplicationContext();
        players = gv.getPlayers();
        playerNames = gv.getPlayerNames();

Pour accéder à ces variables. La première ligne là où je définis gv lève une exception classcastexception. Quelqu'un sait pourquoi?

Voici le code que j'ai ajouté au manifeste:

<application Android:name="com.myname.GlobalVars"
 Android:icon="@drawable/icon"
 Android:label="@string/app_name"></application>

edit: pour plus de clarté, voici tout mon manifeste:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:Android="http://schemas.Android.com/apk/res/Android"
    package="com.myname.bpstattracker" Android:versionCode="1"
    Android:versionName="1.0">
    <application Android:icon="@drawable/icon" Android:label="@string/app_name">
        <activity Android:name=".BPStatTracker" Android:label="@string/app_name">
            <intent-filter>
                <action Android:name="Android.intent.action.MAIN" />
                <category Android:name="Android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <activity Android:name=".BPSTAdd"></activity>
        <activity Android:name=".OneOrThree"></activity>
        <activity Android:name=".SixOrTen"></activity>

    </application>


    <application Android:name="com.myname.GlobalVars"
        Android:icon="@drawable/icon" Android:label="@string/app_name">

</application>
</manifest> 
24
Seth Nelson

Pour développer la réponse de Peter K, vous n'avez pas besoin de créer un second <application> section pour votre classe d'application dérivée. Il vous suffit de "renommer" votre <application> section en la modifiant avec le Android:name tag. Je tiens également à souligner que le nom de classe complet est requis (comme vous l'avez fait correctement ... J'ai trouvé cela à la dure).

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:Android="http://schemas.Android.com/apk/res/Android"
    package="com.myname.bpstattracker" Android:versionCode="1"
    Android:versionName="1.0">
    <application Android:name="com.myname.GlobalVars" Android:icon="@drawable/icon" Android:label="@string/app_name">
        <activity Android:name=".BPStatTracker" Android:label="@string/app_name">
            <intent-filter>
                <action Android:name="Android.intent.action.MAIN" />
                <category Android:name="Android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <activity Android:name=".BPSTAdd"></activity>
        <activity Android:name=".OneOrThree"></activity>
        <activity Android:name=".SixOrTen"></activity>

    </application>
</manifest>
39
barneco

Pour être clair,

<application
    Android:allowBackup="true"
    Android:icon="@drawable/icon_app"
    Android:label="@string/app_title"
    Android:theme="@Android:style/Theme.NoTitleBar.Fullscreen" >

Est mon manifeste existant. Pour déclarer une autre application dans mon manifeste existant et/ou une application, je voudrais simplement ajouter:

Android:name="com.XXXXXX.data.DataStore"

Le résultat final sera donc:

<application
    Android:name="com.XXXXXX.data.DataStore" *<-- class that extends Application and has global variables with exact package and class name*
    Android:allowBackup="true"
    Android:icon="@drawable/icon_app"
    Android:label="@string/app_title"
    Android:theme="@Android:style/Theme.NoTitleBar.Fullscreen" >
9
mrkarp

Vous devez appeler getApplication() dans votre activité ou service:

GlobalVars gv = (GlobalVars)getApplication();

Modifier:

Tu as <application> défini deux fois dans votre manifeste.

5
Peter Knego