【问题标题】:Can't resolve findPreference() from MainActivity?无法从 MainActivity 解析 findPreference()?
【发布时间】:2016-12-24 00:53:02
【问题描述】:

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

findPreference() 应该从实现 PreferenceActivity 接口的类中调用

但我不明白执行此操作的代码是什么。如何摆脱编译器错误并成功设置首选项更改的侦听器?

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

【问题讨论】:

    标签: android android-preferences android-sharedpreferences


    【解决方案1】:

    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 的实际 UI,例如,如果您在使用列表首选项时选择三个值之一,它会在屏幕上显示您刚刚选择的值。

    【讨论】:

    • @Lyla——我很欣赏第一段的好信息。但是“类似”??您的第一行在Activity 中不起作用。为什么不给我们一些您在实际工作程序中使用的东西,以便在Activity 中使用findPreference 进行模仿。
    猜你喜欢
    • 2016-04-17
    • 1970-01-01
    • 1970-01-01
    • 2016-08-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-19
    • 1970-01-01
    • 2020-10-12
    相关资源
    最近更新 更多