2010-12-31 7 views
22

ここで説明するスキームを使用して、アプリケーション内のさまざまなアクティビティにわたって2つの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を定義する最初の行はクラスキャスト例外をスローします。誰でも知っている理由は?

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

あなたが 'あなたのマニフェストに二度' を定義しています。 –

答えて

37

Peter Kの答えを詳述するために、派生したアプリケーションクラスの2番目の<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> 
+0

いくつかの回: <アプリケーション アンドロイド:名=「com.example.MyAppClass」 アンドロイド:allowBackup =「真」> <活動 アンドロイド:名= "COM .example.MyAppClass」 アンドロイド:configChangesは= "ロケール" アンドロイド:ラベル= "MyAppClass"> <アクションアンドロイド:名= "トリックザッツcom.example.MyAppClass" /> – ahmedibrahim085

5

あなたの活動やサービスでgetApplication()を呼び出す必要があります:

明確化のため、ここでは私の全体のマニフェストである

ここで私はマニフェストに追加したコードです

GlobalVars gv = (GlobalVars)getApplication(); 

編集:

マニフェストに<application>が2回定義されています。

+0

何も変更されていません –

+0

最初のアプリケーションタグとその内部のすべてのものがEclipseによって自動生成されました。最初のアプリケーションに新しい名前/ラベル/アイコンを付けるように変更しても、プログラムの実行方法が完全に崩れないでしょうか? –

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

、人々はどのように多くの面白いですこの質問をして、これは唯一のtruley明確なawnserだった。ありがとうBarneco – mrkarp

関連する問題