2014-10-22 2 views
0

내 Android 용 응용 프로그램에 언어 설정이 있습니다. 현재 언어를 SharedPreferences에 저장하고 올바른 언어로 표시 될 수 있도록 스택의 모든 활동을 다시 시작하는 onSharedPreferencesChanged를 사용합니다.대화 상자를 표시하고 활동을 다시 시작하면 LeakedWindow 오류가 발생합니다.

이것은 매력처럼 작동하지만 언어 설정이 대화 상자에 표시되므로 변경하려는 언어를 클릭하면 공유 환경 설정이 변경된 다음 누출 된 창 오류가 발생합니다.

public void showDialog(View v) { 
     final CharSequence[] items = { res.getString(R.string.english), 
       res.getString(R.string.spanish) }; 
     AlertDialog.Builder builder = new AlertDialog.Builder(this); 
     builder.setTitle(res.getString(R.string.change_language)); 

     builder.setSingleChoiceItems(items, selected, 
       new DialogInterface.OnClickListener() { 

        @Override 
        public void onClick(DialogInterface dialog, int item) { 

         switch (item) { 
         case 0: // English 
          if (selected == 0) { 
           Toast.makeText(
             SettingsActivity.this, 
             res.getString(R.string.current_language), 
             Toast.LENGTH_LONG).show(); 
           break; 
          } 
          changeLocale("en"); 
          break; 
         case 1: // Spanish 
          if (selected == 1) { 
           Toast.makeText(
             SettingsActivity.this, 
             res.getString(R.string.current_language), 
             Toast.LENGTH_LONG).show(); 
           break; 
          } 
          changeLocale("es"); 
          break; 
         } 
         alert.dismiss(); 
        } 
       }); 

     alert = builder.create(); 
     builder.show(); 

    } 

@Override 
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, 
     String key) { 
    if (key.equals("language")) { 
     restartActivity(); 
    } 
} 

이 방법은 내 모든 활동의 부모 활동에 있습니다

public void restartActivity() { 
    Intent intent = getIntent(); 
    finish(); 
    startActivity(intent); 
} 

임 라인 builder.show (에서 유출 된 윈도우를) 받고 난 모든 활동를 다시 시작하고 있습니다 때문에 공유 환경 설정이 변경됩니다. 이 오류 메시지없이 대화 상자를 표시하고 활동을 다시 시작하려면 어떻게합니까?

미리 감사드립니다.

+0

'AlertDialog.Builder'가 생성자에서'this'를 참조하기 때문에 누출 된 창을 얻게됩니다. 모든 코드를 게시 할 수 있습니까? 다시 시작했을 때 무엇을하고 있는지 잘 모르겠습니다. –

+0

새 편집 확인 –

+0

이전에 작성한 AlertDialog를 닫기 전에 작업을 완료 한 것 같습니다. 아래 대답을 참조하십시오. –

답변

1

Abdallah의 대답을 설명하면 onClick 콜백 메소드의 첫 번째 문으로 dismiss()을 위로 이동하십시오.

편집 : 먼저 alert = builder.create();으로 전화 한 후 alert.show()이라고하고 builder.show()이 아닌 번호로 전화해야합니다. 또한 주석에 언급 된 수정 사항을 사용하면 더 이상 오류가 발생하지 않아야합니다.

+0

아직도 유출 된 창가가 있습니까? : ( –

+0

시험을 위해서 토스트 전화를 없애십시오 –

+0

여전히 오류가 발생합니다 –

0

코드가 활동을 종료 한 후 대화 상자를 표시하려고합니다.

이 문제를 방지하려면 활동을 다시 시작하기 전에 대화 상자를 닫아야합니다().

관련 문제