如何在 PreferenceChangeListener 中启动 Intent
How to start an Intent in PreferenceChangeListener
我在我的应用程序中使用自动生成的(由 Android Studio)SettingsActivity
。
我创建了一个 Listener
以在 Preference
更改后重新启动应用程序,但由于某种原因我无法从此 Listener
.
启动新的 Intent
代码如下:
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);
}
我必须为此 class 创建一个新实例,因为我从静态方法调用了非静态方法。
通过此方法调用侦听器:
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[=14=]0(SettingsActivity.java:16)
at appinventor.ai_itiel_maimon.Rubiks_cube.SettingsActivity.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)
不要用 new
创建 Activity。要么将侦听器更改为非静态,要么将重新启动应用程序方法设为静态并使用 Context 参数。那只是糟糕的设计,可能会导致意外错误,您当然不能使用 activity 来调用 startActivity
我在我的应用程序中使用自动生成的(由 Android Studio)SettingsActivity
。
我创建了一个 Listener
以在 Preference
更改后重新启动应用程序,但由于某种原因我无法从此 Listener
.
Intent
代码如下:
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);
}
我必须为此 class 创建一个新实例,因为我从静态方法调用了非静态方法。
通过此方法调用侦听器:
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[=14=]0(SettingsActivity.java:16)
at appinventor.ai_itiel_maimon.Rubiks_cube.SettingsActivity.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)
不要用 new
创建 Activity。要么将侦听器更改为非静态,要么将重新启动应用程序方法设为静态并使用 Context 参数。那只是糟糕的设计,可能会导致意外错误,您当然不能使用 activity 来调用 startActivity