如何在API 15至28版本中使用Android PreferenceActivity?
在API 15-28中使用PreferenceActivity的可行方案
我太懂你的困扰了——要适配没搭AndroidX的老设备,PreferenceActivity是刚需,但核心方法又被标废弃,网上教程还大多停留在旧写法上。其实官方早就给了兼容方案,刚好覆盖你要的API 15到28范围,下面给你一步步说清楚:
推荐方案:用PreferenceFragment嵌入PreferenceActivity
从API 11开始Android就引入了PreferenceFragment,虽然PreferenceActivity的addPreferencesFromResource()在API 15被废弃,但Fragment里的同名方法在API 29之前都是可用的,完美适配你的需求。这种方式也是官方推荐的,扩展性和维护性都更好。
1. 编写PreferenceActivity代码
把Activity作为容器,内部嵌套一个PreferenceFragment来加载设置资源:
public class SettingsActivity extends PreferenceActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // 用Fragment替换Activity的内容区域 getFragmentManager().beginTransaction() .replace(android.R.id.content, new SettingsFragment()) .commit(); } // 内部类实现PreferenceFragment,负责加载设置项 public static class SettingsFragment extends PreferenceFragment { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // 这里加载你的preferences配置文件,这个方法在API 15-28完全可用 addPreferencesFromResource(R.xml.preferences); } } }
2. 编写preferences配置文件
在res/xml目录下创建preferences.xml,写法和旧版完全一致:
<?xml version="1.0" encoding="utf-8"?> <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"> <PreferenceCategory android:title="基础设置"> <CheckBoxPreference android:key="auto_update" android:title="自动更新" android:summary="开启后自动检查新版本"/> <EditTextPreference android:key="nickname" android:title="昵称" android:summary="设置你的显示名称"/> </PreferenceCategory> </PreferenceScreen>
备选方案:直接用废弃方法(不推荐但可用)
如果你不想用Fragment,其实废弃的PreferenceActivity.addPreferencesFromResource()在API 15-28里还是能正常运行的,只是IDE会标警告。你可以添加注解消除警告:
@SuppressWarnings("deprecation") public class SettingsActivity extends PreferenceActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); addPreferencesFromResource(R.xml.preferences); } }
⚠️ 注意:这种写法虽然能用,但官方不推荐,后续版本(比如API 29+)会彻底移除该方法,只是你的需求是到28,所以临时用也没问题。
额外注意事项
- 权限适配:如果设置项涉及敏感操作(比如存储、位置),在API 23及以上要记得处理运行时权限请求。
- 样式统一:可以给SettingsActivity设置系统主题,比如
Theme.Holo.Settings,让设置页面和系统风格更协调。 - 状态保存:Fragment默认会处理配置变化(比如横屏切换)的状态保存,无需额外操作。
内容的提问来源于stack exchange,提问作者Kolodez
相关产品推荐
相关产品推荐

