无法从 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, ""));
                    }
                }
            }
        }
    }

findPreferencePreferenceFragmentPreferenceActivity 的一部分的方法 - 这些 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 在屏幕上编辑。