PreferenceActivity:getFragmentManager() 已被弃用
PreferenceActivity: getFragmentManager() has been deprecated
测试 android.preference.PreferenceActivity 时,我收到以下警告:
warning: [deprecation] getFragmentManager() in Activity has been deprecated
这就是我获取当前 PreferenceFragment
:
句柄的方式
FragmentManager fm = this.mActivity.getFragmentManager();
this.currentFragment = (PreferenceFragment) fm.getFragments().get(1);
使用 FragmentActivity.getSupportFragmentManager()
显然不是一个选项。
我找到了 PreferenceFragmentCompat,它将取代已弃用的 PreferenceFragment
。
但是 androidx
可以替代 PreferenceActivity
吗?
UI 类 作为设备固件的一部分提供的与片段相关的 Android 已在 Android 28 中弃用。建议移动到支持库 类 Activity
s 和 Fragment
s.
已经有关于此的其他帖子:
- Since the Android getFragmentManager() API is deprecated, is there any alternative?
我想到的是 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;
}
...
}
更新:同时还有PreferenceFragmentCompat,默认支持
测试 android.preference.PreferenceActivity 时,我收到以下警告:
warning: [deprecation] getFragmentManager() in Activity has been deprecated
这就是我获取当前 PreferenceFragment
:
FragmentManager fm = this.mActivity.getFragmentManager();
this.currentFragment = (PreferenceFragment) fm.getFragments().get(1);
使用 FragmentActivity.getSupportFragmentManager()
显然不是一个选项。
我找到了 PreferenceFragmentCompat,它将取代已弃用的 PreferenceFragment
。
但是 androidx
可以替代 PreferenceActivity
吗?
UI 类 作为设备固件的一部分提供的与片段相关的 Android 已在 Android 28 中弃用。建议移动到支持库 类 Activity
s 和 Fragment
s.
已经有关于此的其他帖子:
- Since the Android getFragmentManager() API is deprecated, is there any alternative?
我想到的是 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;
}
...
}
更新:同时还有PreferenceFragmentCompat,默认支持