如何从OnSharedPreferenceListener访问特定片段的Preference对象?

时间:2013-07-30 19:55:19

标签: android fragment android-preferences

我有一堆PreferenceFragments,它们从XML文件中加载资源。

在某些情况下,此片段中的某些设置应无法访问。

当我把所有东西放在一个片段中时,它很好。然而,当我将它分成不同的碎片时,它就成了问题。

我有一些字段引用特定片段中的首选项。例如:

public class GeneralPrefFragment extends PreferenceFragment {

    public Preference mExpandDockPreference;
    public Preference mDefaultPagePreference;
    public Preference mDockModePreference;

    public static GeneralPrefFragment fragment;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        addPreferencesFromResource(R.xml.general_settings);



        fragment=this;
        Debug.d("Assigning fragment");
        if(fragment==null) {
            Debug.d("Fragment is null");
        }
        mExpandDockPreference=findPreference("dockStateDefault");
        mDefaultPagePreference=findPreference("defaultPage");
        mDockModePreference=findPreference("dockMode");
    }
}

正如您所看到的,我在创建时将静态引用保存到fragment的实例,在我的OnSharedPreferenceChangeListener中,我引用了特定的字段,如GeneralPrefFragment.fragment.mDockModePreference。我知道这是错误的方式,也许是我的Listener什么都不做或者与NPE崩溃的原因。 但是正确的方法是什么?如何访问FragmentPreference中的特定首选项以禁用它?

或者我可以在OnSharedPreferenceChangeListener中使用findPreference,它会返回正确的Preference而不管片段是什么?

1 个答案:

答案 0 :(得分:1)

看起来没有这样的方法(除了手动创建带片段的活动,并处理保存首选项... meh)。

然而,我以不同的方式解决了这个问题:

  1. 在每个片段的onResume()方法中,我得到一个默认的SharedPreferences实例。然后,我检查影响我的设置项可用性的首选项,并相应地禁用它们/启用它们。

  2. 我为每个PreferenceFragment创建了OnSharedPreferenceChangeListener。因此,如果有更改应该在同一个片段中立即显示给用户,那么监听器就可以完成这项工作。否则,可用性由其他片段的onResume()方法调节。