2016-07-22 11 views
0

Ich verwende das automatisch generierte (von Android Studio) SettingsActivity in meiner App. Ich habe eine Listener erstellt, um die App nach Preference Änderungen neu zu starten, aber aus irgendeinem Grund kann ich kein neues Intent von diesem Listener starten. HierSo starten Sie eine Absicht in PreferenceChangeListener

ist der Code:

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

Und:

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

Ich hatte eine neue Instanz dieser Klasse zu erstellen, weil ich eine Nicht statische Methode aus einer statischen Methode aufrufen.

wird der Hörer von dieser Methode genannt:

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(), "")); 
} 

Und diese Methode von hier genannt wird: Erstellen Sie keine

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) 

Antwort

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

Dies ist logcat eine Aktivität mit new. Ändern Sie den Listener entweder auf "nicht statisch" oder machen Sie die App-Neustartmethode statisch und verwenden Sie einen Kontextparameter. Das ist nur schlechtes Design und kann unerwartete Fehler verursachen, und Sie können diese Aktivität sicherlich nicht verwenden, um

+0

anzurufen Ich versuchte, die App-Neustartmethode statisch zu machen, aber wie kann ich einen Kontextparameter verwenden? –

+0

Ich würde mit dem Entfernen der 'static' aus dem' onPreferenceChangesListener' gehen – Muzikant

+0

Und ich kann den Listener nicht zu statisch ändern, weil es von einer statischen Methode aufgerufen wird, die statisch sein muss. –