Android Settings

本文探讨了Android Settings的源码,重点关注了Android 4.4版本的Settings和PreferenceFragmentCompat的使用。作者从Preference Headers开始,研究了SettingsActivity和Settings.java的源码,并介绍了PreferenceFragmentCompat作为替代PreferenceActivity的原因。此外,还讨论了设置如何适应平板,点击事件处理,数据保存方法,以及使用SQLite数据库的例子。最后,文章提到了不同Android版本设置的差异,特别是WiFiSettings的实现,包括扫描、结果展示和监听WiFi状态的机制。
摘要由CSDN通过智能技术生成

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()) {
   
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值