无法从 MainActivity 解析 findPreference()?
Can't resolve findPreference() from MainActivity?
当我尝试在我的 MainActivity 中初始化 OnSharedPreferencesChanged
侦听器时,我遇到编译器错误 无法解析方法 findPreference。根据回答here:
findPreference() should be called from a class implementing PreferenceActivity interface
但我不明白执行此操作的代码是什么。我怎样才能摆脱编译器错误并成功设置侦听器以进行首选项更改?
MainActivity.java
public class MainActivity extends FragmentActivity implements SharedPreferences.OnSharedPreferenceChangeListener {
private SharedPreferences.OnSharedPreferenceChangeListener listener;
@Override
protected void onCreate(Bundle savedInstanceState) {
...
//Test preference menu
listener = new SharedPreferences.OnSharedPreferenceChangeListener() {
public void onSharedPreferenceChanged(SharedPreferences prefs, String key) {
if (key.equals("pref_wood")) {
Preference woodPref = findPreference(key); //COMPILER ERROR HERE
MainActivity.getGLSurfaceView().setTexture("");
// Set summary to be the user-description for the selected value
woodPref.setSummary(sharedPreferences.getString(key, ""));
}
}
}
}
}
findPreference
是 PreferenceFragment
和 PreferenceActivity
的一部分的方法 - 这些 Fragments/Activities 实际显示您的首选项屏幕(activity 已弃用,您应该使用 PreferenceFragment
).
您正在尝试在 MainActivity
中使用它。这不起作用,因为 Preference 对象实际上并不存在于此屏幕上(它们存在于另一个 activity 中,通常有一个 PreferenceFragment
作为它的一部分)。如果您需要访问 activity 中不是您的首选项屏幕的首选项的首选项值,请使用 SharedPreferences
,例如:
SharedPreferences sharedPref = getActivity().getPreferences(Context.MODE_PRIVATE);
int defaultValue = getResources().getBoolean(R.bool.saved_high_score_default);
boolean wood = sharedPref.getBoolean(pref_wood, defaultValue);
您可以查看 documentation 以获取更多示例。
如果您的 MainActivity
应该是一个显示设置的屏幕,那么您应该重命名它并在其中包含一个首选项片段。
我相信你也会 运行 陷入 setSummary
的麻烦,因为 Preference
不是这个 activity 的一部分,它是 activity 你实际修改首选项的地方。 setSummary
用于更新 Preference
的实际 UI,例如,如果您在使用列表首选项时 select 是三个值之一,它会显示该值您刚刚 select 在屏幕上编辑。
当我尝试在我的 MainActivity 中初始化 OnSharedPreferencesChanged
侦听器时,我遇到编译器错误 无法解析方法 findPreference。根据回答here:
findPreference() should be called from a class implementing PreferenceActivity interface
但我不明白执行此操作的代码是什么。我怎样才能摆脱编译器错误并成功设置侦听器以进行首选项更改?
MainActivity.java
public class MainActivity extends FragmentActivity implements SharedPreferences.OnSharedPreferenceChangeListener {
private SharedPreferences.OnSharedPreferenceChangeListener listener;
@Override
protected void onCreate(Bundle savedInstanceState) {
...
//Test preference menu
listener = new SharedPreferences.OnSharedPreferenceChangeListener() {
public void onSharedPreferenceChanged(SharedPreferences prefs, String key) {
if (key.equals("pref_wood")) {
Preference woodPref = findPreference(key); //COMPILER ERROR HERE
MainActivity.getGLSurfaceView().setTexture("");
// Set summary to be the user-description for the selected value
woodPref.setSummary(sharedPreferences.getString(key, ""));
}
}
}
}
}
findPreference
是 PreferenceFragment
和 PreferenceActivity
的一部分的方法 - 这些 Fragments/Activities 实际显示您的首选项屏幕(activity 已弃用,您应该使用 PreferenceFragment
).
您正在尝试在 MainActivity
中使用它。这不起作用,因为 Preference 对象实际上并不存在于此屏幕上(它们存在于另一个 activity 中,通常有一个 PreferenceFragment
作为它的一部分)。如果您需要访问 activity 中不是您的首选项屏幕的首选项的首选项值,请使用 SharedPreferences
,例如:
SharedPreferences sharedPref = getActivity().getPreferences(Context.MODE_PRIVATE);
int defaultValue = getResources().getBoolean(R.bool.saved_high_score_default);
boolean wood = sharedPref.getBoolean(pref_wood, defaultValue);
您可以查看 documentation 以获取更多示例。
如果您的 MainActivity
应该是一个显示设置的屏幕,那么您应该重命名它并在其中包含一个首选项片段。
我相信你也会 运行 陷入 setSummary
的麻烦,因为 Preference
不是这个 activity 的一部分,它是 activity 你实际修改首选项的地方。 setSummary
用于更新 Preference
的实际 UI,例如,如果您在使用列表首选项时 select 是三个值之一,它会显示该值您刚刚 select 在屏幕上编辑。