2017-12-29 35 views
0

나는 재 시합을 할 수있는 2 인 게임을 만들고있다. 나는 또한 각 선수의 점수를 추적하고있다. 사용자가 재 대결 버튼을 클릭하면 위의 코드를 호출앱을 다시 시작한 후 점수를 기억하는 방법은 무엇입니까?

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() 메서드에서이 의도에 액세스하는 방법을 모르겠습니다. 어떤 도움이라도 대단히 감사합니다!

+0

SharedPreferences의 변수에 이전에 저장 한 값이 있는지 확인합니다. – MyMy

+0

@Mayk 어떻게해야할지 모르겠습니다. 제발 좀 더 자세히 설명해 주시겠습니까? – Zelda

+0

이전에 SharedPreferences에 저장 한 값을 요청할 때 onCreate에서 응용 프로그램을 다시 시작한 후에 반환되는 값을 인쇄하도록했습니다. 예 : System.out.println (p1Score); 문제가 어디에서 왔는지 알아 내려고합니다. – MyMy

답변

0

당신은이 같은 Bundle 매개 변수를 변경할 응용 프로그램의 상태 값 onSaveInstanceState(Bundle savedInstanceState)을 무시하고 작성해야하십시오 NVP ("이름 - 값 쌍을"저장하는 방법은 기본적으로

@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. 
} 

번들입니다)지도, 그것은 onCreate()에 전달 얻을 것이다 또한 onRestoreInstanceState()이 같은 값을 추출 할 위치 : 당신은 일반적으로 APPL에 대한 인스턴스 값을 저장하기 위해이 기술을 사용

@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); 
} 

(선택, 저장되지 않은 텍스트 등).

+0

방금 ​​시도했지만 작동하지 않는 것 같습니다. onCreate() 도중이 두 메소드가 자동으로 호출됩니까? 나는 그것이 자동이라고 가정했기 때문에 onCreate()에서 호출하지 않았다. 또한, onRestoreInstanceState 메소드의 경우 왜 설정을 사용합니까? 그것들은 SharedPreferences ... – Zelda

0

여기에서 문제는 첫 번째 활동의 onStop() 실행이 완료된 후 새 활동의 onCreate()이 호출된다고 가정합니다.

두 가지가 완전히 관련이 없기 때문에 아마 원하는 가정이 아닙니다.

당신은 코드를 취할 필요가

public void onCreate(Bundle savedInstance) { 
    super.onCreate(); 
    .. 

    int p1Score = getIntent().getIntExtra("scoreOne", 0); 
    int p2Score = getIntent().getIntExtra("scoreTwo", 0); 
} 
0

을 다음과 같이 그 값을 추출 할 수 있습니다 당신이 의도

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에서 새로 만든 활동에 필요한 값을 보내기 onStop에서 finish()으로 전화하기 전에 rematch 메소드에서 실행하십시오. 이처럼 :

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를 사용하고있다.