Settings 模块简单设计
任务 1
在一级菜单页底部增加一行,点击这行,跳转到二级菜单,在二级菜单,有一行,是开关按钮,可以记录上次的选中状态。
解决思路
首先在设置中寻找相似的功能,如:top_level_accounts 账户功能,查看其相应的 fragment 和 xml 以及 controller,复制后根据自己的需求进行修改与删除。
方法一:
- 步骤一: 在 res/xml/top_level_settings.xml 后面添加 Preference,并根据需要添加元素。
<Preference
android:key="top_level_statusrecord"
android:summary="@string/statusrecord_summary"
android:title="@string/status_record"
android:order="110"
android:icon="@drawable/ic_homepage_status_record"
android:fragment="com.android.settings.deviceinfo.aboutphone.StatusRecordFragment" />
- 步骤二:在 res/xml/statusrecord.xml 根据需要创建 xml 文件
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen
xmlns:android="http://schemas.android.com/apk/res/android"
android:key="switch_status_settings">
<SwitchPreference
android:key="switch_change"
android:title="@string/switch_change_title"
android:summary="@string/switch_change_summary"
android:summaryOn="@string/switch_change_on_summary"
android:summaryOff="@string/switch_change_off_summary" />
</PreferenceScreen>
- 步骤三:在 src/com/android/settings/custom/StatusRecordFragment.java 根据需要创建java文件
package com.android.settings.custom;
import android.app.settings.SettingsEnums;
import android.content.Context;
import android.os.Bundle;
import android.provider.Settings;
import android.util.Log;
import android.widget.Toast;
import androidx.preference.Preference;
import androidx.preference.SwitchPreference;
import com.android.settings.R;
import com.android.settings.dashboard.DashboardFragment;
public class StatusRecordFragment extends DashboardFragment {
private static final String TAG = "StatusRecordFragment";
// 定义开关变量
private SwitchPreference switchCustomConfig;
// 定义上下文
private Context mContext;
// 定义开关状态变量
private Boolean value;
@Override
public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
super.onCreatePreferences(savedInstanceState, rootKey);
switchCustomConfig = findPreference("switch_change");
// 获取 xml 界面
// addPreferencesFromResource(R.xml.statusrecord);
// 获取开关的状态,第一次进去设置默认值为 1
value = Settings.Global.getInt(mContext.getContentResolver(), "switchPreference", 0) == 1;
// 通过查询取出的value值判断设置开关的状态
switchCustomConfig.setChecked(value);
// 设置开关的监听状态
switchCustomConfig.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
value = (Boolean) newValue;
// 把开关的状态值存入
Settings.Global.putInt(mContext.getContentResolver(), "switchPreference", (Boolean) newValue ? 1 : 0);
// 开启
return true;
}
});
}
@Override
public int getMetricsCategory() {
return SettingsEnums.ACCOUNT ;
}
@Override
protected String getLogTag() {
return TAG;
}
@Override
protected int getPreferenceScreenResId() {
return R.xml.statusrecord;
}
@Override
public int getHelpResource() {
return super.getHelpResource();
}
// 获取上下文
@java.lang.Override
public void onAttach(Context context) {
super.onAttach(context);
mContext = context;
}
}
任务 2
隐藏“设置->关于手机->Legal information”菜单.
解决思路
百度 在 my_divice_info.xml 文件的 android:key=“legal_container” 的 Preference 下添加
settings:searchable=“false” 试验后发现是屏蔽关键词,并未隐藏
应添加 settings:isPreferenceVisible=“false” 试验后 成功。
<Preference
android:key="legal_container"
android:order="15"
android:title="@string/legal_information"
android:fragment="com.android.settings.LegalSettings"
settings:allowDividerAbove="true"
settings:isPreferenceVisible="false" />
任务 3
将“设置->关于手机->版本号”移到到上一层界面
解决思路
首先从二级菜单中找到版本号,将版本号的 preference 复制到一级模块中,push 后发现点击后会出现闪退;
找出原因为无法显示点击功能,则进入版本号 BuildNumberPreferenceController.java 查看代码,自定义 CustomBuildNumberPreferenceController.java 将 handlePreferenceTreeClick() 、onActivityResult()、 enableDevelopmentSettings()、注释后则可以使点击功能失效;
如果想要将版本号的启动开发者功能则需要进入 src/com/android/settings/deviceinfo/aboutphone/MyDeviceInfoFragment.java 搜索 BuildNumberPreferenceController 将与之相关的代码复制到 src/com/android/settings/homepage/TopLevelSettings.java 中,且重新使用版本号的BuildNumberPreferenceController.java。
<Preference
android:key="build_number"
android:order="120"
android:title="@string/build_number"
android:summary="@string/summary_placeholder"
settings:allowDividerAbove="true"
settings:enableCopying="true"
settings:controller="com.android.settings.deviceinfo.BuildNumberPreferenceController"/>
// 导包
import com.android.settings.deviceinfo.BuildNumberPreferenceController;
// 定义变量
private BuildNumberPreferenceController mBuildNumberPreferenceController;
@Override
public void onAttach(Context context) {
super.onAttach(context);
use(SupportPreferenceController.class).setActivity(getActivity());
mBuildNumberPreferenceController = use(BuildNumberPreferenceController.class);
mBuildNumberPreferenceController.setHost(this /* parent */);
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
if (mBuildNumberPreferenceController.onActivityResult(requestCode, resultCode, data)) {
return;
}
super.onActivityResult(requestCode, resultCode, data);
}
Error 与 解决方法
push error
remote couldn’t create file: Read-only file system
解决方法:
adb disable-verity
adb reboot
adb root
adb remount
remote write failed: No space left on device
解决方法:
adb root
adb remount
strings error
设置 string 值时注意事项:
需要在 res/values/strings.xml 与 res/values-zh-rCN/strings.xml 同时添加
且可以在 该目录寻找自己所需的信息
<string name="statusrecord_summary">Switch button for recording status</string>
<string name="status_record">Status record</string>
<string name="switch_change_title">Switch</string>
<string name="switch_change_summary">Hello, this is the switch button</string>
<string name="switch_change_on_summary">Hello, the switch button is on</string>
<string name="switch_change_off_summary">Hello, the switch button is off</string>
<string name="status_record">状态记录</string>
<string name="statusrecord_summary">记录状态的开关按钮</string>
<string name="switch_change_title">开关</string>
<string name="switch_change_summary">你好,我是开关按钮</string>
<string name="switch_change_on_summary">你好,开关按钮开启了</string>
<string name="switch_change_off_summary">你好,开关按钮关闭了</string>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)