[英]How do I change my level after a certain score has been reached? (Java, NetBeans)
[英]How to remember score after app has been restarted?
我正在做一個兩人游戲,我可以重新比賽。 我也在跟蹤每個玩家的分數。 這是我的重賽代碼如下所示:
public void rematch(View view) {
Intent i = getBaseContext().getPackageManager()
.getLaunchIntentForPackage( getBaseContext().getPackageName() );
i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
finish();
startActivity(i);
}
當用戶單擊重新匹配按鈕時,將調用上述代碼。 我基本上只是重新啟動應用程序,因為它比重置我擁有的所有變量都容易。 無論如何,為了跟蹤得分,我像這樣重寫了onStop()
方法:
@Override
protected void onStop() {
super.onStop();
// We need an Editor object to make preference changes.
// All objects are from android.context.Context
SharedPreferences settings = getSharedPreferences(SCORES_NAME, 0);
SharedPreferences.Editor editor = settings.edit();
editor.putInt("scoreOne", p1Score);
editor.putInt("scoreTwo", p2Score);
editor.commit();
}
我正在使用共享首選項。 然后,在我的onCreate方法中,我得到了這些共享的首選項,如下所示:
// Remember scores from previous games
SharedPreferences settings = getSharedPreferences(SCORES_NAME, 0);
p1Score = settings.getInt("scoreOne", 0);
p2Score = settings.getInt("scoreTwo", 0);
updateScores();
SCORES_NAME
是public static final String SCORES_NAME = "MyScores";
這一切都不起作用。 我在游戲重新開始后的得分總是回到0。我正在考慮在rematch()
的意圖中添加額外內容,但是我不確定如何在我的onCreate()
方法中訪問此意圖。 任何幫助是極大的贊賞!
您需要重寫onSaveInstanceState(Bundle savedInstanceState)
並將要更改的應用程序狀態值寫入Bundle
參數,如下所示:
@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
super.onSaveInstanceState(savedInstanceState);
// Save UI state changes to the savedInstanceState.
// This bundle will be passed to onCreate if the process is
// killed and restarted.
savedInstanceState.putInt("scoreOne", p1Score);
savedInstanceState.putInt("scoreTwo", p2Score);
// etc.
}
Bundle本質上是一種存儲NVP(“名稱-值對”)映射的方法,它將被傳遞給onCreate()
以及onRestoreInstanceState()
,您可以在其中提取如下值:
@Override
public void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
// Restore UI state from the savedInstanceState.
// This bundle has also been passed to onCreate.
int p1Score = settings.getInt("scoreOne", 0);
int p2Score = settings.getInt("scoreTwo", 0);
}
通常,您將使用此技術來存儲應用程序的實例值(選擇,未保存的文本等)。
這里的問題是您假設在第一個活動的onStop()
完成執行后將調用新活動的onCreate()
。
這可能不是您要做出的假設,因為它們是兩個不完全相關的事物。
將您需要的值發送到意圖中的新創建的活動
public void rematch(View view) {
Intent i = getBaseContext().getPackageManager()
.getLaunchIntentForPackage( getBaseContext().getPackageName() );
i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
// Those next values will be there for sure in the new activity.
i.putExtra("scoreOne", p1Score);
i.putExtra("scoreTwo", p2Score);
finish();
startActivity(i);
}
並且在您的Activity
的onCreate中可以按以下方式提取這些值
public void onCreate(Bundle savedInstance) {
super.onCreate();
..
int p1Score = getIntent().getIntExtra("scoreOne", 0);
int p2Score = getIntent().getIntExtra("scoreTwo", 0);
}
您需要從onStop
獲取代碼並執行代碼,然后再從rematch
方法調用finish()
。 像這樣:
private void saveScores() {
SharedPreferences settings = getSharedPreferences(SCORES_NAME, 0);
SharedPreferences.Editor editor = settings.edit();
editor.putInt("scoreOne", p1Score);
editor.putInt("scoreTwo", p2Score);
editor.commit();
}
然后從rematch
調用此函數:
(...)
i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
saveScores();
finish();
startActivity(i);
但是,@ elmorabea的解決方案更好,因為您現在僅使用SharedPreferences在活動之間傳遞值。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.