【问题标题】:PreferenceActivity: getFragmentManager() has been deprecatedPreferenceActivity:getFragmentManager() 已被弃用
【发布时间】:2026-01-29 01:15:02
【问题描述】:

在测试android.preference.PreferenceActivity 时,我收到以下警告:

警告:Activity 中的 [deprecation] getFragmentManager() 已被弃用

这就是我获取当前PreferenceFragment的句柄的方式:

FragmentManager fm = this.mActivity.getFragmentManager();
this.currentFragment = (PreferenceFragment) fm.getFragments().get(1);

使用FragmentActivity.getSupportFragmentManager() 显然不是一种选择。

我找到了PreferenceFragmentCompat,它将替换已弃用的PreferenceFragment

但是PreferenceActivity 是否有任何androidx 替代品?

【问题讨论】:

  • 好问题,它可能是 Android 类文档中的错误。您应该在 Google 问题跟踪器上发布错误。显然使用getSupportFragmentManager 不是一种选择。

标签: android android-fragments android-preferences deprecation-warning androidx


【解决方案1】:

我想出的是一个AppCompatActivity,它膨胀了androidxPreferenceFragment。我保留了以前的EXTRA_SHOW_FRAGMENT,因此切换到特定的PreferenceFragment 仍然可以工作。 EXTRA_NO_HEADERS 尚未考虑:

/**
 * Preference {@link AppCompatActivity}.
 * @see <a href="https://developer.android.com/reference/androidx/preference/Preference Fragment">PreferenceFragment</a>
**/
public final class PreferenceCompatActivity extends AppCompatActivity {

    /** the class-name of the main {@link androidx.preference.PreferenceFragment} */
    public static final String MAIN_FRAGMENT = "com.acme.fragment.PreferencesFragment";

    /** framework {@link Intent} extra */
    public static final String EXTRA_SHOW_FRAGMENT = ":android:show_fragment";

    /** framework {@link Intent} extra */
    public static final String EXTRA_NO_HEADERS = ":android:no_headers";

    /** the currently displayed {@link PreferenceFragment} */
    private PreferenceFragment currentFragment;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        String fragmentName = MAIN_FRAGMENT;
        Intent intent = getIntent();
        if (intent.getStringExtra(EXTRA_SHOW_FRAGMENT) != null) {
            fragmentName = intent.getStringExtra(EXTRA_SHOW_FRAGMENT);
        }
        this.switchToFragment(fragmentName, null);
    }

    private void switchToFragment(String fragmentName, @Nullable Bundle args) {
        PreferenceFragment fragment;
        switch(fragmentName) {
            // case "": {break;}
            default: {
                fragment = new PreferencesFragment();
            }
        }
        getFragmentManager().beginTransaction().replace(android.R.id.content, fragment).commit();
        this.currentFragment = fragment;
    }

    @VisibleForTesting(otherwise = VisibleForTesting.NONE)
    public PreferenceFragment getCurrentFragment() {
        return this.currentFragment;
    }

    ...
}

更新:同时有PreferenceFragmentCompat,默认支持。

【讨论】:

    【解决方案2】:

    作为设备固件的一部分提供的与 Fragment 相关的 UI 类已在 Android 28 中弃用。建议移至 Activitys 和 Fragments 的支持库类。

    已经有其他关于此的帖子:

    【讨论】:

      最近更新 更多