PreferenceActivity: getFragmentManager () объявлен устаревшим - PullRequest
0 голосов
/ 31 октября 2018

при тестировании android.preference.PreferenceActivity появляется следующее предупреждение:

предупреждение: [deprecation] getFragmentManager () в Activity устарел

вот так я получаю дескриптор текущего PreferenceFragment:

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

использование FragmentActivity.getSupportFragmentManager(), очевидно, не вариант.

найдено PreferenceFragmentCompat , которое заменит устаревший PreferenceFragment.

но есть ли androidx замена для PreferenceActivity?

Ответы [ 2 ]

0 голосов
/ 31 октября 2018

то, что я имел в виду ... - это AppCompatActivity, который раздувает androidx PreferenceFragment . Я сохранил предыдущий 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;
    }

    ...
}
0 голосов
/ 31 октября 2018

Классы пользовательского интерфейса, связанные с фрагментами, которые поставляются как часть прошивки устройства, в Android 28. устарели. Рекомендуется перейти к классам поддержки библиотеки на Activity с и Fragment с.

Уже есть другие посты по этому поводу:

...