2010-12-31 3 views
22

Ich versuche zu teilen zwei Arraylisten über die verschiedenen Aktivitäten in meiner Anwendung zu teilen, erklärt das System mit sich hier: How to declare global variables in Android?.Anwendung erweitern Variablen global

Hier ist meine Anwendung Unterklasse:

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

} 

und verwendet den Code:

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

Um diese Variablen zuzugreifen. Die erste Zeile dort, wo ich gv definiere, löst eine Klassenkassexperte aus. Wer weiß warum?

Hier ist der Code, den ich zu dem Manifest hinzugefügt:

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

edit: Klärungs, hier ist mein ganzes Manifest:

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

Sie haben '' definiert zweimal in Ihrem Manifest . –

Antwort

37

auf Peter K Antwort Um dies näher auszuführen, brauchen Sie nicht einen zweiten <application> Abschnitt für Ihre abgeleiteten Anwendungsklasse zu erstellen. Sie müssen einfach Ihre vorhandenen <application> Abschnitt „umbenennen“, indem sie es mit dem android:name Tag ändern. Ich mag auch darauf hinweisen, dass der vollständig qualifizierte Klassenname erforderlich ist (wie man es richtig gemacht hat ... ich dies habe auf die harte Art und Weise heraus).

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

Manchmal müssen Sie es an mehreren Stellen im Manifest implementieren: ahmedibrahim085

5

Sie sollten getApplication() in Ihrer Aktivität anrufen oder Service:

GlobalVars gv = (GlobalVars)getApplication(); 

Bearbeiten:

Sie haben <application> zweimal in Ihrem Manifest definiert.

+0

hat nichts geändert –

+0

Das erste Anwendungs-Tag und alle darin enthaltenen Dinge wurden von Eclipse automatisch generiert. Wenn ich die erste Anwendung ändere, um ihr einen neuen Namen/ein anderes neues Label/Icon zu geben, würde das die Art und Weise, wie mein Programm läuft, nicht komplett vermasseln? –

+1

Ändern Name/Label/Symbol nicht „schrauben Sie die Art und Weise Programm läuft up“. –

9

Um klar zu sein,

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

Ist mein bestehendes Manifest. Um eine andere Anwendung in meinem bestehenden Manifest zu deklarieren und oder App alle zusammen, ich würde einfach hinzufügen:

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

So das Ergebnis wird sein:

<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

das ist der Trick, komisch, wie viele Menschen sind Diese Frage stellte sich, und das war der einzige eindeutige Kenner.Danke Barneco – mrkarp