无法从MainActivity解析findPreference()?

时间:2016-12-24 00:53:03

标签: android android-preferences android-sharedpreferences

当我尝试在MainActivity中初始化OnSharedPreferencesChanged侦听器时,我收到编译器错误无法解析方法findPreference 。根据答案here

  应该从实现PreferenceActivity接口的类

中调用findPreference()

但我不明白这样做的代码是什么。如何摆脱编译器错误并成功设置侦听器以进行首选项更改?

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

1 个答案:

答案 0 :(得分:7)

findPreferencePreferenceFragmentPreferenceActivity的一部分 - 这些是实际显示您的偏好设置屏幕的片段/活动(该活动已弃用,您应该使用PreferenceFragment)。

您正试图在MainActivity中使用它。这不起作用,因为Preference对象实际上并不存在于此屏幕上(它们存在于另一个通常具有PreferenceFragment作为其一部分的活动中)。如果您需要在非首选屏幕的活动中访问偏好设置的偏好设置值,请使用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不是此活动的一部分,它是您实际修改的活动的一部分喜好。 setSummary用于更新Preference的实际用户界面,例如,如果您在使用列表首选项时选择三个值中的一个,则会显示您刚在屏幕上选择的值。 / p>