PreferenceFragment alternativa para la API de compatibilidad de Android?

Estoy tratando de reemplazar mi TabActivity en mi aplicación con un diseño basado en fragmentos utilizando el paquete de compatibilidad de Android v4.

El problema que tengo es que una de las pestañas de mi TabActivity era PreferencesActivity, que no puedo iniciar desde mi FragmentActivity por razones obvias.

Por lo tanto, ya que, PreferenceFragment no se incluyó en el paquete de compatibilidad de Android, y no puedo iniciar una actividad de preferencia de mi fragmento, ¿qué debo hacer?

Abierto a cualquier sugerencia.

EDIT: La excepción que recibo cuando intento abrir la actividad de PreferenceActivity de mi fragmento está aquí:

FATAL EXCEPTION: main java.lang.IllegalStateException: Did you forget to call 'public void setup(LocalActivityManager activityGroup)'? at android.widget.TabHost$IntentContentStrategy.getContentView(TabHost.java:652) at android.widget.TabHost.setCurrentTab(TabHost.java:326) at android.widget.TabHost$2.onTabSelectionChanged(TabHost.java:132) at android.widget.TabWidget$TabClickListener.onClick(TabWidget.java:456) at android.view.View.performClick(View.java:2485) at android.view.View$PerformClick.run(View.java:9080) at android.os.Handler.handleCallback(Handler.java:587) at android.os.Handler.dispatchMessage(Handler.java:92) at android.os.Looper.loop(Looper.java:130) at android.app.ActivityThread.main(ActivityThread.java:3683) at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:507) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597) at dalvik.system.NativeStart.main(Native Method) 

Y mi código de FragmentActivity es como sigue (la mayor parte tomado del paquete de compatibilidad v4 ejemplo para 'tabs'):

EDIT2: también código de ejemplo añadido, para mayor claridad:

 import java.util.HashMap; import android.content.Context; import android.content.Intent; import android.os.Bundle; import android.os.Environment; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentActivity; import android.support.v4.app.FragmentTransaction; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.widget.TabHost; import android.widget.TextView; public class PlayerTabActivity extends FragmentActivity { private static final String TAG = PlayerTabActivity.class.getSimpleName(); TabHost mTabHost; TabManager mTabManager; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.player_main); mTabHost = (TabHost) findViewById(android.R.id.tabhost); mTabHost.setup(); mTabManager = new TabManager(this, mTabHost, R.id.realtabcontent); //this is my fragment mTabManager.addTab(mTabHost.newTabSpec("player").setIndicator(createTabView(this, "Player")), PlayerMainFragment.class, null); //this is my activity mTabHost.addTab(mTabHost.newTabSpec("settings").setIndicator(createTabView(this, "Settings")) .setContent(new Intent(this, PlayerSettingsActivity.class))); if (savedInstanceState != null) { mTabHost.setCurrentTabByTag(savedInstanceState.getString("tab")); } } //make the tab look pretty private static View createTabView(Context context, String tag) { View view = LayoutInflater.from(context).inflate(R.layout.tabs_bg, null); TextView tv = (TextView) view.findViewById(R.id.tab_text); tv.setText(tag); return view; } @Override protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); outState.putString("tab", mTabHost.getCurrentTabTag()); } /** * This is a helper class that implements a generic mechanism for * associating fragments with the tabs in a tab host. It relies on a trick. * Normally a tab host has a simple API for supplying a View or Intent that * each tab will show. This is not sufficient for switching between * fragments. So instead we make the content part of the tab host 0dp high * (it is not shown) and the TabManager supplies its own dummy view to show * as the tab content. It listens to changes in tabs, and takes care of * switch to the correct fragment shown in a separate content area whenever * the selected tab changes. */ public static class TabManager implements TabHost.OnTabChangeListener { private final FragmentActivity mActivity; private final TabHost mTabHost; private final int mContainerId; private final HashMap<String, TabInfo> mTabs = new HashMap<String, TabInfo>(); TabInfo mLastTab; static final class TabInfo { private final String tag; private final Class<?> clss; private final Bundle args; private Fragment fragment; TabInfo(String _tag, Class<?> _class, Bundle _args) { tag = _tag; clss = _class; args = _args; } } static class DummyTabFactory implements TabHost.TabContentFactory { private final Context mContext; public DummyTabFactory(Context context) { mContext = context; } @Override public View createTabContent(String tag) { View v = new View(mContext); v.setMinimumWidth(0); v.setMinimumHeight(0); return v; } } public TabManager(FragmentActivity activity, TabHost tabHost, int containerId) { mActivity = activity; mTabHost = tabHost; mContainerId = containerId; mTabHost.setOnTabChangedListener(this); } public void addTab(TabHost.TabSpec tabSpec, Class<?> clss, Bundle args) { tabSpec.setContent(new DummyTabFactory(mActivity)); String tag = tabSpec.getTag(); TabInfo info = new TabInfo(tag, clss, args); // Check to see if we already have a fragment for this tab, probably // from a previously saved state. If so, deactivate it, because our // initial state is that a tab isn't shown. info.fragment = mActivity.getSupportFragmentManager().findFragmentByTag(tag); if (info.fragment != null && !info.fragment.isDetached()) { FragmentTransaction ft = mActivity.getSupportFragmentManager().beginTransaction(); ft.detach(info.fragment); ft.commit(); } mTabs.put(tag, info); mTabHost.addTab(tabSpec); } @Override public void onTabChanged(String tabId) { TabInfo newTab = mTabs.get(tabId); if (mLastTab != newTab) { FragmentTransaction ft = mActivity.getSupportFragmentManager().beginTransaction(); if (mLastTab != null) { if (mLastTab.fragment != null) { ft.detach(mLastTab.fragment); } } if (newTab != null) { if (newTab.fragment == null) { newTab.fragment = Fragment.instantiate(mActivity, newTab.clss.getName(), newTab.args); ft.add(mContainerId, newTab.fragment, newTab.tag); } else { ft.attach(newTab.fragment); } } mLastTab = newTab; ft.commit(); mActivity.getSupportFragmentManager().executePendingTransactions(); } } } } 

Vea la última revisión de la v7 support library , que introdujo un PreferenceFragmentCompat .

Una respuesta muy completa (y algún código de ejemplo) está disponible aquí: ¿PreferenceFragment fue intencionalmente excluido del paquete de compatibilidad?

FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.