【Android系统源码修改】在系统设置中添加设置选项

先上效果图:
增加一个设置菜单,点击后弹窗进行选择
【Android系统源码修改】在系统设置中添加设置选项_第1张图片

1 修改Settings/res/xml/dashboard_categories.xml 在需要放置的位置,添加以下代码




android:id 本dashboard-tile的id号
android:fragment 需要打开的界面所在的类
android:icon 显示的图标
android:title 本菜单的标题


2 添加prefs,这里添加的菜单,不需要lauyout文件,直接使用xml/布局
新建文件Settings/res/xml/robot_speech_pref.xml,带一个ListPreference



    


PreferenceScreen:
android:title 本界面的标题
settings:keywords 搜索关键字?
ListPreference:
android:key 本ListPreference的id
android:title 标题
android:entries 选项列表
android:entryValues 选项列表值


3 添加选项列表
在arrays.xml中添加


  近场模式
  远场模式

在strings.xml中添加需要的字符串


4 添加菜单对应的类
该类继承SettingsPreferenceFragment,实现SharedPreferences.OnSharedPreferenceChangeListener接口,用于监听配置改变
将xml加载到界面 调用addPreferencesFromResource(R.xml.robot_speech_pref);
获取保存配置的SharedPreferences speechSP = getPreferenceScreen().getSharedPreferences();
获取R.xml.robot_speech_pref中的元素,我们需要用到的 mWakeupMode = (ListPreference) findPreference(KEY_WAKEUP_MODE);
设置该选项值 mWakeupMode.setValueIndex(index);
设置该选项副标题,或概要 mWakeupMode.setSummary(mWakeupMode.getValue());
获取当前选项值、概要 String value = mWakeupMode.getValue();
获取当前索引 int index = mWakeupMode.findIndexOfValue(value);
注册监听 speechSP.registerOnSharedPreferenceChangeListener(this);
注销监听 speechSP.unregisterOnSharedPreferenceChangeListener(this);
可以参考Settings中的时间日期设置 DateTimeSettings.java 的实现

public class RobotSpeechSettings extends SettingsPreferenceFragment
        implements SharedPreferences.OnSharedPreferenceChangeListener {
    private static final String TAG = RobotSpeechSettings.class.getSimpleName();
    private Context mContext = null;
    private static final String SP_SPEECH_FILE = "robot_speech_file";
    private static final String SP_WAKEUP_MODE_KEY = "robot_wakeup_mode";
    private static SharedPreferences speechSP;
    private static final String KEY_WAKEUP_MODE = "wakeup_mode_list";
    public static final int WAKEUP_MODE_NEAR_FIELD = 0;
    public static final int WAKEUP_MODE_FAR_FIELD = 1;
    private static ListPreference mWakeupMode;
    @Override
    public void onCreate(Bundle icicle) {
        super.onCreate(icicle);
        mContext = this.getActivity();
        addPreferencesFromResource(R.xml.robot_speech_pref);
        init();
    }
    public void init() {
        speechSP = getPreferenceScreen().getSharedPreferences();
        int index = speechSP.getInt(SP_WAKEUP_MODE_KEY, WAKEUP_MODE_FAR_FIELD);
        mWakeupMode = (ListPreference) findPreference(KEY_WAKEUP_MODE);
        mWakeupMode.setValueIndex(index);
        mWakeupMode.setSummary(mWakeupMode.getValue());
    }
    @Override
    public void onResume() {
        super.onResume();
        speechSP.registerOnSharedPreferenceChangeListener(this);
    }
    @Override
    public void onPause() {
        super.onPause();
        speechSP.unregisterOnSharedPreferenceChangeListener(this);
    }
    @Override
    public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
        if (key.equals(KEY_WAKEUP_MODE)) {
            String value = mWakeupMode.getValue();
            int index = mWakeupMode.findIndexOfValue(value);
            mWakeupMode.setSummary(value);
            if (index == WAKEUP_MODE_NEAR_FIELD) {
                // 设置为近场-唤醒模式, 广播给MainService
            } else if (index == WAKEUP_MODE_FAR_FIELD) {
                // 设置为远场-唤醒模式, 广播给MainService
                
            }
            speechSP.edit().putInt(SP_WAKEUP_MODE_KEY, index).apply();
        }
    }
}

你可能感兴趣的:(Android系统源码修改)