2016-07-22 3 views
0

내 앱에서 자동 생성 (Android Studio 제공) SettingsActivity을 사용하고 있습니다. Preference 변경 후 Listener 앱을 다시 만들었지 만 어떤 이유에서이 Listener에서 새로운 Intent을 시작할 수 없습니다.PreferenceChangeListener에서 인 텐트를 시작하는 방법

private static Preference.OnPreferenceChangeListener listener = new Preference.OnPreferenceChangeListener(){ 
    @Override 
    public boolean onPreferenceChange(Preference preference, Object o) { 
     SettingsActivity settingsActivity = new SettingsActivity(); 
     settingsActivity.restartApp(); 
     return true; 
    } 
}; 

그리고 :

private void restartApp() { 
    Intent intent = new Intent(SettingsActivity.this, MainActivity.class); 
    intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
    SettingsActivity.this.finish(); 
    startActivity(intent); 
} 

내가 정적 방법에서 비 정적 메소드를 호출하기 때문에이 클래스에 새로운 인스턴스를 생성 한 다음

는 코드입니다. 여기에서

private static void bindPreferenceSummaryToValue(Preference preference) { 
    // Set the listener to watch for value changes. 
    preference.setOnPreferenceChangeListener(sBindPreferenceSummaryToValueListener); 
    preference.setOnPreferenceChangeListener(listener); 

    // Trigger the listener immediately with the preference's 
    // current value. 
    sBindPreferenceSummaryToValueListener.onPreferenceChange(preference, 
      PreferenceManager 
        .getDefaultSharedPreferences(preference.getContext()) 
        .getString(preference.getKey(), "")); 
} 

그리고이 방법은 호출됩니다 :

청취자는이 방법에서 호출

Process: appinventor.ai_itiel_maimon.Rubiks_cube, PID: 14454 
java.lang.NullPointerException: Attempt to invoke virtual method 'android.app.ActivityThread$ApplicationThread android.app.ActivityThread.getApplicationThread()' on a null object reference 
at android.app.Activity.startActivityForResult(Activity.java:4283) 
at android.app.Activity.startActivityForResult(Activity.java:4230) 
at android.app.Activity.startActivity(Activity.java:4567) 
at android.app.Activity.startActivity(Activity.java:4535) 
at appinventor.ai_itiel_maimon.Rubiks_cube.SettingsActivity.restartApp(SettingsActivity.java:59) 
at appinventor.ai_itiel_maimon.Rubiks_cube.SettingsActivity.access$000(SettingsActivity.java:16) 
at appinventor.ai_itiel_maimon.Rubiks_cube.SettingsActivity$2.onPreferenceChange(SettingsActivity.java:50) 
at android.preference.Preference.callChangeListener(Preference.java:1173) 
at android.preference.ListPreference.onDialogClosed(ListPreference.java:282) 
at android.preference.DialogPreference.onDismiss(DialogPreference.java:424) 
at android.app.Dialog$ListenersHandler.handleMessage(Dialog.java:1533) 
at android.os.Handler.dispatchMessage(Handler.java:102) 
at android.os.Looper.loop(Looper.java:158) 
at android.app.ActivityThread.main(ActivityThread.java:7229) 
at java.lang.reflect.Method.invoke(Native Method) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120) 

답변

1

만들지 마십시오 :

@TargetApi(Build.VERSION_CODES.HONEYCOMB) 
public static class GeneralPreferenceFragment extends PreferenceFragment { 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     addPreferencesFromResource(R.xml.pref_general); 
     setHasOptionsMenu(true); 

     bindPreferenceSummaryToValue(findPreference(getString(R.string.language_shared_pref_key))); 
    } 
} 

이는 로그 캣입니다 new의 활동 청취자를 static이 아닌 것으로 변경하거나 재시작 app 메소드를 정적으로 설정하고 Context 매개 변수를 사용하십시오. 그건 그냥 나쁜 디자인이고 예기치 않은 오류가 발생할 수 있습니다. 전화를 걸기 위해 해당 활동을 사용할 수 없습니다. startActivity

+0

재시작 app 메소드를 정적으로 만들려고했지만 Context 매개 변수는 어떻게 사용할 수 있습니까? –

+0

'onPreferenceChangesListener'에서'static'을 제거하기 시작합니다. – Muzikant

+0

정적이어야하는 정적 메서드에서 호출 되었기 때문에 리스너를 정적이 아닌 것으로 변경할 수 없습니다. –

관련 문제