2

ゲームでいくつかのアクティビティを終えたばかりで、それぞれの部分が機能することを確認するためだけに使用していたテスト データの代わりに、実際のゲーム データを使用するために両方を接続し始めようとしていました。複数のアクティビティがこのゲーム データにアクセスする必要があるため、このデータを自分のアクティビティに渡す最善の方法を調査し始めました。

インテントで putExtra を使用することは知っていますが、私の GameData クラスには、単純なキーと値のペアだけでなく、かなりの量のデータが含まれています。かなりの数の基本的なデータ型に加えて、大きな配列もあります。キーとデータのペアだけでなく、オブジェクト全体を渡すことができない限り、すべてを渡そうとはしませんでした。

次の投稿を読んで、これでいいと思いましたが、これまでのところ、うまくいきませんでした。

Androidでグローバル変数を宣言するには?

この方法を試すために簡単なテスト アプリを作成しましたが、クラッシュし続け、私のコードは上記の投稿と同じように見えますが、名前を変更しました。これが私が得ているエラーです。誰かが私が間違っていることを理解するのを手伝ってくれますか?

12-23 00:50:49.762: エラー/AndroidRuntime(608): 原因: java.lang.ClassCastException: android.app.Application

次のステートメントでクラッシュします。

GameData newGameData = ((GameData)getApplicationContext());  

これが私のコードです:

package mrk.examples.MainActivity;

import android.app.Application;

public class GameData extends Application {
    private int intTest;

    GameData () {
        intTest = 0;
    }

    public int getIntTest(){
        return intTest;
    }

    public void setIntTest(int value){
        intTest = value;
    }
}

// 私の主な活動

package mrk.examples.MainActivity;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;

public class MainActivity extends Activity {

    int intLocal;

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        GameData newGameData = ((GameData) getApplicationContext());
        newGameData.setIntTest(0);
        intLocal = newGameData.getIntTest();
        Log.d("MainActivity", "IntLocal = " + intLocal);
        newGameData.setIntTest(1);
        Log.d("MainActivity", "IntLocal = " + intLocal
                + " newGameData IntTest: " + newGameData.getIntTest());
        Intent intentNew = new Intent(this, PassData2Activity.class);
        startActivity(intentNew);
    }
}

// 私のテスト アクティビティは、最後のアクティビティからデータとその前の状態にアクセスできるかどうかを確認します

package mrk.examples.MainActivity;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;

public class PassData2Activity extends Activity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        GameData gamedataPass = ((GameData)getApplicationContext());
        Log.d("PassData2Activity", "gamedatapass IntTest =  " +
                                         gamedataPass.getIntTest());           
    }
}

以下は、私のマニフェストの関連部分です。

<application android:icon="@drawable/icon"
             android:label="@string/app_name">    
    <activity android:name=".MainActivity"
              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=".PassData2Activity"></activity>

</application> 

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

このコードがクラッシュする理由を理解してください。

また、複数のアクティビティが同じデータにアクセスできるようにするためのアプローチが間違っていると思われる場合は、提案をお願いします。かなりの数の変数といくつかの大きな配列について話していることに注意してください。

4

3 に答える 3

7

よくわかりませんが、マニフェスト内のこれらのタグを次のように 1 つのタグに結合する必要があると思います。.(イニシャルをショートカットとして使用するのではなく、アプリのパッケージ名を完全に綴る必要がある場合もあります。)

<application android:icon="@drawable/icon"
             android:name=".GameData"
             android:label="@string/app_name">    
    <activity android:name=".StaticGameData"
              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=".PassData2Activity"></activity>
</application> 

(ちなみに、GameDataアプリケーションとStaticGameDataアクティビティの名前を使用することは避けたいと思います。これらの名前から、StaticGameDataのサブクラスになると思われますGameData。)

于 2010-12-23T18:53:01.590 に答える
2

これが機能するかどうかはわかりませんが、getApplicationContext()の代わりにgetApplication()を使用してみてください。

于 2010-12-23T18:06:15.087 に答える
0

私はまだ全文を読んでいませんが、カスタム オブジェクトが parcelable を実装していれば、putExtra を使用してカスタム オブジェクトをインテントに渡すことができると思います。

于 2010-12-23T17:52:10.357 に答える