2016-07-22 78 views
0

我使用產生的自身(由Android工作室)SettingsActivity。 我創建了一個ListenerPreference變化重新啓動應用程序,但由於某種原因,我不能啓動從這個ListenerIntent如何在我的應用程序啓動的意圖在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(), "")); 
} 

而且這種方法被稱爲從這裏:

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

這是logcat的:

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

不要創建與new一個活動。將偵聽器更改爲非靜態或使重新啓動應用程序方法靜態並使用Context參數。這只是糟糕的設計可能會導致意外的錯誤,你當然不能使用活動來調用startActivity

+0

我試圖使重新啓動應用程序的方法靜態的,而是我如何使用上下文參數? –

+0

我會用除去了'onPreferenceChangesListener' – Muzikant

+0

了'static'開始和我不能改變聽者不是靜態的,因爲它是必須是靜態的靜態方法調用。 –

相關問題