SystemSetting源码解析
项目在做设置相关,但在设置状态的同步和储存,不同列表之前的跳转上一直没法达到最优的想过,所以想看看Android源码中的设置是如何写的,虽然有难度,但慢慢看总能看懂的。
Preference Headers 是什么
android 9.0 http://androidxref.com/9.0.0_r3/xref/packages/apps/Settings/src/com/android/settings/ 源码位置
先看Android.mk include frameworks/base/packages/SettingsLib/common.mk 后面用到再看
packages/apps/Settings/src/com/android/settings/Settings.java
仅用于启动程序活动的别名,因为它属于每个配置文件。
public class Settings extends SettingsActivity //Top-level Settings activity
packages/apps/Settings/src/com/android/settings/SettingsActivity.java
public class SettingsActivity extends SettingsDrawerActivity
implements PreferenceManager.OnPreferenceTreeClickListener,
PreferenceFragment.OnPreferenceStartFragmentCallback,
ButtonBarHandler, FragmentManager.OnBackStackChangedListener {
Android 4.4 Settings
packages/apps/Settings/src/com/android/settings/Settings.java
public class Settings extends PreferenceActivity
implements ButtonBarHandler, OnAccountsUpdateListener {
PreferenceActivity API29已经弃用,使用PreferenceFragmentCompat替换 https://developer.android.google.cn/guide/topics/ui/settings.html
设置源码介绍
https://blog.csdn.net/qq_34149526/article/details/83186719
PreferenceFragmentCompat的使用Demo
1.设置如何适配平板的?
AS中可以直接新建一个SettingsActivity
<PreferenceScreen xmlns:app="http://schemas.android.com/apk/res-auto">
<Preference
app:fragment="com.example.viewapplication.SettingsActivity$MessagesFragment"
app:icon="@drawable/messages"
app:key="messages_header"
app:title="@string/messages_header" />
<Preference
app:fragment="com.example.viewapplication.SettingsActivity$SyncFragment"
app:icon="@drawable/sync"
app:key="sync_header"
app:title="@string/sync_header" />
</PreferenceScreen>
public static class MessagesFragment extends PreferenceFragmentCompat {
@Override
public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
setPreferencesFromResource(R.xml.messages_preferences, rootKey);
}
}
<PreferenceScreen xmlns:app="http://schemas.android.com/apk/res-auto">
<EditTextPreference
app:key="signature"
app:title="@string/signature_title"
app:useSimpleSummaryProvider="true" />
<ListPreference
app:defaultValue="reply"
app:entries="@array/reply_entries"
app:entryValues="@array/reply_values"
app:key="reply"
app:title="@string/reply_title"
app:useSimpleSummaryProvider="true" />
</PreferenceScreen>
1.点击事件的处理
Preference.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
@Override
public boolean onPreferenceClick(Preference preference) {
Log.d(TITLE_TAG, "onPreferenceClick() called with: preference = [" + preference + "]");
return false;
}
});
2.保存值的读取
SharedPreferences sharedPreferences =
PreferenceManager.getDefaultSharedPreferences(this /* Activity context */);
String name = sharedPreferences.getString(“signature”, "");
监听偏好设置值的更改
要监听 Preference 值的更改,您可以在两个接口中选择一个:
Preference.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
Log.d(TITLE_TAG, "onPreferenceChange() called with: preference = [" + preference + "], newValue = [" + newValue + "]");
return false;
}
});
preferences.registerOnSharedPreferenceChangeListener(new SharedPreferences.OnSharedPreferenceChangeListener() {
@Override
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
Log.d(TITLE_TAG, "onSharedPreferenceChanged() called with: sharedPreferences = [" + sharedPreferences.getString(key,"") + "], key = [" + key + "]");
}
});
3.使用其他方式保存数据
3.1 采用Sqlite数据库保存数据
https://blog.csdn.net/qq_34149526/article/details/83186719
android 个版本设置的差异应该不大
/**
* Top-level settings activity to handle single pane and double pane UI layout.
*/
public class Settings extends PreferenceActivity
implements ButtonBarHandler, OnAccountsUpdateListener
PreferenceActivity加载R.xml.settings_headers布局
/**
* Populate the activity with the top-level headers.
*/
@Override
public void onBuildHeaders(List<Header> headers) {
if (!onIsHidingHeaders()) {