首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在PreferenceChangeListener中启动意图

如何在PreferenceChangeListener中启动意图
EN

Stack Overflow用户
提问于 2016-07-22 20:28:47
回答 1查看 236关注 0票数 0

我在我的应用中使用了自动生成的(由Android Studio生成的) SettingsActivity。我创建了一个Listener,以便在Preference更改后重新启动应用程序,但由于某种原因,我无法从此Listener启动新的Intent

代码如下:

代码语言:javascript
复制
private static Preference.OnPreferenceChangeListener listener = new Preference.OnPreferenceChangeListener(){
    @Override
    public boolean onPreferenceChange(Preference preference, Object o) {
        SettingsActivity settingsActivity = new SettingsActivity();
        settingsActivity.restartApp();
        return true;
    }
};

和:

代码语言:javascript
复制
private void restartApp() {
    Intent intent = new Intent(SettingsActivity.this, MainActivity.class);
    intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
    SettingsActivity.this.finish();
    startActivity(intent);
}

我必须为这个类创建一个新的实例,因为我从一个静态方法调用了一个非静态方法。

通过此方法调用侦听器:

代码语言:javascript
复制
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(), ""));
}

此方法从此处调用:

代码语言:javascript
复制
@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:

代码语言:javascript
复制
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)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-07-22 21:19:29

不要使用new创建活动。将侦听器更改为非静态,或者将重新启动应用程序方法设置为静态并使用上下文参数。这是一个糟糕的设计,可能会导致意想不到的错误,而且您肯定不能使用该活动来调用startActivity

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38526449

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档