0

ImageViews (ドラッグ可能)、ToggleButton (サウンドのオン/オフを切り替える)、TextViews (スコア用)、ArrayList、ブール値、整数、文字列、浮動小数点数、およびいくつかの double で構成されるボード ゲームである、最初の Android アプリを作成しています。戻るボタンを押してメイン メニューに移動し、プレイしていたゲームに戻ろうとすると、クラッシュします。onPause、onStop、onRestart、onResume のいずれも実装していません。私はonCreateのみを実装しました。このサイトでいくつかの投稿を確認しましたが、すべての回答がわかりにくいものでした。onPause と onResume または onSaveInstanceState と onRestoreInstanceState を使用して、現在のゲームの状態 (すべてのデータ型とオブジェクト) を保存する必要があります。例をいただければ幸いです。

前もって感謝します!!

私のログキャット

09-12 16:13:06.326: E/AndroidRuntime(14207): FATAL EXCEPTION: main
09-12 16:13:06.326: E/AndroidRuntime(14207): java.lang.RuntimeException: Unable to resume activity {com.example.baghchalNepal/com.example.baghchal.UserAsTiger}: java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first.
09-12 16:13:06.326: E/AndroidRuntime(14207):    at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2851)
09-12 16:13:06.326: E/AndroidRuntime(14207):    at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:2880)
09-12 16:13:06.326: E/AndroidRuntime(14207):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2302)
09-12 16:13:06.326: E/AndroidRuntime(14207):    at android.app.ActivityThread.access$700(ActivityThread.java:152)
09-12 16:13:06.326: E/AndroidRuntime(14207):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1282)
09-12 16:13:06.326: E/AndroidRuntime(14207):    at android.os.Handler.dispatchMessage(Handler.java:99)
09-12 16:13:06.326: E/AndroidRuntime(14207):    at android.os.Looper.loop(Looper.java:137)
09-12 16:13:06.326: E/AndroidRuntime(14207):    at android.app.ActivityThread.main(ActivityThread.java:5328)
09-12 16:13:06.326: E/AndroidRuntime(14207):    at java.lang.reflect.Method.invokeNative(Native Method)
09-12 16:13:06.326: E/AndroidRuntime(14207):    at java.lang.reflect.Method.invoke(Method.java:511)
09-12 16:13:06.326: E/AndroidRuntime(14207):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1102)
09-12 16:13:06.326: E/AndroidRuntime(14207):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:869)
09-12 16:13:06.326: E/AndroidRuntime(14207):    at dalvik.system.NativeStart.main(Native Method)
09-12 16:13:06.326: E/AndroidRuntime(14207): Caused by: java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first.
09-12 16:13:06.326: E/AndroidRuntime(14207):    at android.view.ViewGroup.addViewInner(ViewGroup.java:3435)
09-12 16:13:06.326: E/AndroidRuntime(14207):    at android.view.ViewGroup.addView(ViewGroup.java:3306)
09-12 16:13:06.326: E/AndroidRuntime(14207):    at android.view.ViewGroup.addView(ViewGroup.java:3251)
09-12 16:13:06.326: E/AndroidRuntime(14207):    at android.view.ViewGroup.addView(ViewGroup.java:3227)
09-12 16:13:06.326: E/AndroidRuntime(14207):    at com.example.baghchal.UserAsTiger.makeGoatMove(UserAsTiger.java:683)
09-12 16:13:06.326: E/AndroidRuntime(14207):    at com.example.baghchal.UserAsTiger.onResume(UserAsTiger.java:297)
09-12 16:13:06.326: E/AndroidRuntime(14207):    at android.app.Instrumentation.callActivityOnResume(Instrumentation.java:1202)
09-12 16:13:06.326: E/AndroidRuntime(14207):    at android.app.Activity.performResume(Activity.java:5328)
09-12 16:13:06.326: E/AndroidRuntime(14207):    at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2841)
09-12 16:13:06.326: E/AndroidRuntime(14207):    ... 12 more

Java コード

    // create ImageView object to store a goat.
    ImageView thisGoat = null;          
    
    // This method call receives safest position where a goat can be placed.
    Point bestPoint = getBestPointToPlaceGoat();

    // if there are goats remained to be placed on the board, select a goat to be moved to the board.
    for (int i=0; i<imageArrayList.size(); i++) {
        if ((imageArrayList.get(i).getX() == (xMin+70)) &&  (imageArrayList.get(i).getY() == (yMin-200))){
            thisGoat = imageArrayList.get(i);
            break;
        }
    }
    
    // move the goat, if a goat was selected from above.
    if (thisGoat != null) {         

         // Here I am removing the ImageView obj
        relativeLayout.removeView(thisGoat);  

        thisGoat.setX(bestPoint.getX()-70);
        thisGoat.setY(bestPoint.getY()-70);
        bestPoint.setOccupiedBy("goat");            
        
         // this is where error is acc. to logcat
        relativeLayout.addView(thisGoat);           
    }
4

2 に答える 2

0

戻るボタンを押してメイン メニューに移動し、プレイしていたゲームに戻ろうとすると、クラッシュします。

あなたが述べたように、唯一の問題が戻るボタンを押したときである場合は、戻るボタンを上書きしてそこにデータを保存することができます

@Override
public void onBackPressed()
{
    // save your data here using SharedPrefs, DB, or however you need
}

onResume()あなたはActivity殺されonCreate()、保存されたデータをチェックして値を元に戻すことができる場所で再度呼び出されるため、実装する必要はありません。

Activity別のものがいつフォアグラウンドに来るのか心配しているが、現在Activityはまだスタック上にある場合onPause()は、同じ方法でオーバーライドして、その関数にデータを保存できます。

これらが役に立たない場合は、Prmths のコメントに記載されているように、logcat を投稿して、エラーの内容を確認してください。

ライフサイクルの例を含むアクティビティ ドキュメント

于 2013-09-12T20:55:41.420 に答える
-1

これらの方法はあなたのために完全に使用されます

SharedPreferencesを使用してデータを保存し、onResumeでデータを取り戻すことができます。詳細はこちらから

@Override
protected void onResume()
{       
    super.onResume();
}
@Override
protected void onPause()
{
    super.onPause();
}
@Override
protected void onSaveInstanceState(Bundle outState)
{
    // Save your data here
    super.onSaveInstanceState(outState);
}
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState)
{
    super.onRestoreInstanceState(savedInstanceState);       
     // REtrieve your data heve
}

アクティビティのライフ サイクルについてさらに学習します。

ここに画像の説明を入力

于 2013-09-12T20:56:17.707 に答える