You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 08:07:12