Как указывает @CommonsWare, невозможно переписать PreferenceActivity на то, что я хотел, и это похоже на нагрузку.
Не слишком элегантное решение, на котором я остановился, состояло в том, чтобы создать две PreferenceActivities (, как показано здесь ), а также создать два подкласса Fragment, по одному для каждого варианта Fragment.
Итак, PrefsActivityHC
добавляет этот заголовок:
<header
<!-- An android.app.Fragment subclass -->
android:fragment="com.example.project.MyFragmentHC"
</header>
... в то время как PrefsActivity
добавляет это предпочтение:
<Preference>
<intent
<!-- A v4.support.app.Fragment subclass, wrapped in an ActivityFragment -->
android:targetClass="com.example.project.MyFragmentActivity"
android:targetPackage="com.example.project" >
</intent>
</Preference>
Чтобы свести к минимуму объем дублирования кода, необходимого для двух почти идентичных фрагментов, я создал класс MyFragmentDelegate
, который поддерживает общие методы фрагментов, и сохранил экземпляр этого в MyFragment
и MyFragmentHC
. Вызовы методов в этих фрагментах затем просто перенаправляются делегату:
class MyFragment {
MyFragmentDelegate mDelegate;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
return mDelegate.onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
}
}
class MyFragmentHC {
MyFragmentDelegate mDelegate;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
return mDelegate.onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
}
}