扩展应用程序以全局共享变量

时间:2010-12-31 21:17:13

标签: android global-variables

我正在尝试在我的应用程序中的各种活动中共享两个ArrayLists,使用此处说明的方案:How to declare global variables in Android?

这是我的应用程序子类:

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

}

并使用了代码:

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

访问这些变量。我定义gv的第一行引发了classcastexception。谁知道为什么?

这是我添加到清单中的代码:

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

编辑:为了澄清,这是我的整个清单:

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

3 个答案:

答案 0 :(得分:39)

要详细说明Peter K的答案,您不需要为派生的Application类创建第二个<application>部分。您只需要通过使用<application>标记对其进行修改即可“重命名”现有的android:name部分。我还想指出完全限定的类名是必需的(因为你做得正确......我发现这很难)。

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

答案 1 :(得分:9)

要清楚,

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

是我现有的清单。要在我现有的清单中声明另一个应用程序,或者将所有应用程序一起声明,我只需添加:

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

所以最终结果将是:

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

答案 2 :(得分:5)

您应该在您的活动或服务中致电getApplication()

GlobalVars gv = (GlobalVars)getApplication();

修改:

您在清单中定义了两次<application>