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资源。

 

 

更多推荐