【发布时间】:2017-07-25 01:38:20
【问题描述】:
当首选项更改时,我正在尝试使用新设置重新启动服务。我使用的代码与this question的代码大致相似:
SettingsActivity.java
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Initiate listener
findPreference("service_switch").setOnPreferenceChangeListener(sRestartMyServiceOnChangeListener);
...
}
private Preference.OnPreferenceChangeListener sRestartMyServiceOnChangeListener = new Preference.OnPreferenceChangeListener() {
@Override
public boolean onPreferenceChange(Preference preference, Object obj) {
SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(SettingsActivity.this);
// Stop service
stopService(new Intent(SettingsActivity.this, MyService.class));
// Restart service
if (sharedPref.getBoolean("service_switch", false)) {
startService(new Intent(SettingsActivity.this, MyService.class));
}
return true;
}
};
这在我的手机上不起作用,抛出错误:
findPreference(java.lang.CharSequence) is deprecated
This answer 表示 Android 已转向基于片段的活动。 SettingsActivity 基于片段...所以我尝试在片段的onCreate() 中启动监听器:
@TargetApi(Build.VERSION_CODES.HONEYCOMB)
public static class GeneralPreferenceFragment extends PreferenceFragment {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
...
// Initiate listener
findPreference("service_switch").setOnPreferenceChangeListener(sRestartMyServiceOnChangeListener);
...
}
}
现在我没有看到弃用错误,但我得到了一个新错误:
Non-static field 'sRestartMyServiceOnChangeListener' cannot be referenced from a static context.
我不能将sRestartMyServiceOnChangeListener 设为静态,因为stopService() 和startService() 都是非静态的。我也无法将片段设为静态:
This fragment inner class should be static
那么当设置更改时,如何从首选项片段重新启动 MyService?
【问题讨论】:
-
为什么不能将 GeneralPreferenceFragment 设为非静态?
-
它抛出错误
This fragment inner class should be static。 -
你的外部类是什么,内部类需要什么?请发布您的完整代码以便更好地理解。
-
外部类是活动本身:
public class SettingsActivity extends AppCompatPreferenceActivity。 AFAIK,片段必须属于一个活动。在this question 中有一些关于为什么片段内部类必须是静态的讨论。 -
那么最好将首选项更改侦听器移动到 GeneralPreferenceFragment 本身并调用服务。从活动中获取上下文并使用它来调用 startservice 方法
标签: java android android-fragments