【Android系统源码修改】在系统设置中添加设置选项
先上效果图:
增加一个设置菜单,点击后弹窗进行选择
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
<?xml version="1.0" encoding="utf-8"?>
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(安卓)Activity界面切换添加动画特效
- "Failed to fetch URL https://dl-ssl.google.com/android/repos
- Android(安卓)MediaPlayer 常用方法介绍
- Android(安卓)流式布局FlowLayout(搜索历史),多布局、删除、添加
- Android(安卓)SDK Manager无法更新的解决
- Android(安卓)Activity界面切换添加动画特效
- [APP] Android(安卓)开发笔记 006-使用短信验证SDK进行短信验证
- 修复Android(安卓)App在开机后入口类被启动两次的bug
- Android(安卓)实现View中添加子元素的动态效果