Android R Settings的各Fragments
Android R Settings的各Fragments。

自写应用Fragment继承自PreferenceFragmentCompat时,当我们发现似乎可以这样用:
@Override
public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
getPreferenceManager().setSharedPreferencesName("mysetting");//mysetting就是修改后的配置名
addPreferencesFromResource(R.xml.pref_appsettings_others);//必须放在修改配置名之后
}
看了下PreferenceFragmentCompat,其继承自Preference, 在onCreate里边调用了本类的唯一被申明为抽象的方法。
public abstract class PreferenceFragmentCompat extends Fragment implements OnPreferenceTreeClickListener, OnDisplayPreferenceDialogListener, OnNavigateToScreenListener, TargetFragment {
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
TypedValue tv = new TypedValue();
this.getActivity().getTheme().resolveAttribute(attr.preferenceTheme, tv, true);
int theme = tv.resourceId;
if (theme == 0) {
theme = style.PreferenceThemeOverlay;
}
this.getActivity().getTheme().applyStyle(theme, false);
this.mPreferenceManager = new PreferenceManager(this.getContext());
this.mPreferenceManager.setOnNavigateToScreenListener(this);
Bundle args = this.getArguments();
String rootKey;
if (args != null) {
rootKey = this.getArguments().getString("androidx.preference.PreferenceFragmentCompat.PREFERENCE_ROOT");
} else {
rootKey = null;
}
this.onCreatePreferences(savedInstanceState, rootKey);
}
public abstract void onCreatePreferences(Bundle var1, String var2);
}
但是在其间接子类中重写了onCreatePreferences()方法,内容如下:
public abstract class InstrumentedPreferenceFragment extends ObservablePreferenceFragment
implements Instrumentable {
@Override
public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
final int resId = getPreferenceScreenResId();
if (resId > 0) {
addPreferencesFromResource(resId);
}
}
/**
* Get the res id for static preference xml for this fragment.
*/
protected int getPreferenceScreenResId() {
return -1;
}
}
可以注意到,其间接子类是个抽象类,意味着要被继承实例化,但是如果getPreferenceScreenResId方法未被Override,则PreferenceFragmentCompat在onCreate()调用的onCreatePreferences()永远为空执行。
意味着如果你实例化的Fragment里边有给出xml资源文件,则直接onCreate()生命周期就开始加载PreferenceScreen元素。
以Settings的两个栗子看看。
1.FingerprintSettings
未Override getPreferenceScreenResId()方法,而是在onResume时,自己通过createPreferenceHierarchy()加载xml元素。
2.DisplaySettings
Override了getPreferenceScreenResId()方法,但是也其直接父类也Override了onCreatePreferences(in Bundle savedInstanceState, in String rootKey)方法,却并未调用super.onCreatePreferences(),因此DisplaySettings也不是通过该默认方式添加xml资源。
更多推荐



所有评论(0)