我有一堆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而不管片段是什么?
答案 0 :(得分:1)
看起来没有这样的方法(除了手动创建带片段的活动,并处理保存首选项... meh)。
然而,我以不同的方式解决了这个问题:在每个片段的onResume()方法中,我得到一个默认的SharedPreferences实例。然后,我检查影响我的设置项可用性的首选项,并相应地禁用它们/启用它们。
我为每个PreferenceFragment创建了OnSharedPreferenceChangeListener。因此,如果有更改应该在同一个片段中立即显示给用户,那么监听器就可以完成这项工作。否则,可用性由其他片段的onResume()方法调节。