2010-12-31 8 views
22

Sto provando a condividere due liste di array tra le varie attività nella mia applicazione, utilizzando lo schema spiegato qui: How to declare global variables in Android?.Estensione dell'applicazione per condividere variabili globalmente

Ecco il mio sottoclasse applicazione:

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; 
    } 

} 

e utilizzavano il codice:

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

Per accedere a queste variabili. La prima riga in cui definisco gv genera una percezione di classe. Qualcuno sa perché?

Ecco il codice ho aggiunto al manifesto:

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

edit: per chiarimenti, qui è tutta la mia palese:

<?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> 
+11

Hai '' definito due volte nella vostra manifest . –

risposta

37

Per elaborare la risposta di Peter K, non è necessario creare una seconda sezione <application> per la classe di applicazione derivata. È sufficiente "rinominare" la sezione esistente <application> modificandola con il tag android:name. Voglio anche sottolineare che è richiesto il nome di classe completo (come hai fatto correttamente ... l'ho trovato nel modo più duro).

<?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> 
+0

Alcune volte sarà necessario per la sua attuazione in diversi luoghi nel manifesto: ahmedibrahim085

5

Si dovrebbe chiamare getApplication() nella vostra attività o servizio:

GlobalVars gv = (GlobalVars)getApplication(); 

Modifica:

Hai definito <application> due volte nel tuo manifest.

+0

non ha modificato nulla –

+0

Il primo tag dell'applicazione e tutte le cose al suo interno sono stati generati automaticamente da Eclipse. Se cambio la prima applicazione per dargli un nuovo nome/etichetta/icona non rovinerà completamente il modo in cui viene eseguito il mio programma? –

+1

Cambiare nome/etichetta/icona non "rovinerà il modo in cui il programma gira". –

9

Per essere chiari,

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

È il mio manifesto esistente. Per dichiarare un'altra applicazione nel mio manifesto esistente, o di applicazione tutti insieme, vorrei semplicemente aggiungere:

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

Così il risultato finale sarà:

<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" > 
+0

Questo è il trucco, divertenti quante persone sono ponendo questa domanda, e questo era l'unico vero e proprio caparbio.Grazie Barneco – mrkarp

Problemi correlati