Расширение приложения для общего доступа к переменным - PullRequest
24 голосов
/ 01 января 2011

Я пытаюсь разделить два ArrayList по различным действиям в моем приложении, используя схему, описанную здесь: Как объявить глобальные переменные в 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>

edit: для пояснения, вот весь мой манифест:

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

39 голосов
/ 05 января 2011

Чтобы уточнить ответ Питера К., вам не нужно создавать второй <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>
9 голосов
/ 09 октября 2014

Чтобы было ясно,

<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" >
5 голосов
/ 01 января 2011

Вы должны позвонить getApplication() в своей деятельности или услуге:

GlobalVars gv = (GlobalVars)getApplication();

Редактировать:

В вашем манифесте дважды определено <application>.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...