title: Using PreferenceFragment in SherlockFragmentActivity with tabs
body: <p>I am trying to make a tabbed activity using <a href="http://actionbarsherlock.com/" rel="nofollow">ABS</a> SherlockFragmentActivity with a ViewPager, and would like to have one of the tabs to contain a preference activity/fragment.</p>
  
  <p>As ABS does not have a SherlockPreferenceFragment, or any kind of support for PreferenceFragment, I <a href="https://github.com/JakeWharton/ActionBarSherlock/issues/43" rel="nofollow">found</a> a possible solution using <a href="https://github.com/saik0/UnifiedPreference" rel="nofollow">UnifiedPreference</a></p>
  
  <p>UnifiedPreference works on it's own, demo works great, but if I try to implement it in my ActionBarSherlock powered tabs, it crashes with the message:</p>
  
  <pre><code>04-18 03:59:26.000: E/AndroidRuntime(8437): FATAL EXCEPTION: main
  04-18 03:59:26.000: E/AndroidRuntime(8437): java.lang.ClassCastException: si.neanonimen.Settings$NetSettingsPrefsFragment cannot be cast to android.support.v4.app.Fragment
  04-18 03:59:26.000: E/AndroidRuntime(8437):     at android.support.v4.app.Fragment.instantiate(Fragment.java:384)
  </code></pre>
  
  <p>It looks like <code>UnifiedPreferenceFragment</code> does not extend <code>android.support.v4.app.Fragment</code>.
  Is there any way around this? Has anyone managed to get a working example?</p>
  
  <p>My current code is:</p>
  
  <p>Settings:</p>
  
  <pre><code>public class Settings extends UnifiedSherlockPreferenceActivity {
  
      public static String tag = "Settings";
  
      @Override
      public void onCreate(Bundle savedInstanceState) {
          setHeaderRes(R.xml.pref_headers);
          super.onCreate(savedInstanceState); 
      }
  
      public static class NetSettingsPrefsFragment extends UnifiedPreferenceFragment {}
  }
  </code></pre>
  
  <p>Tabbed activity:</p>
  
  <pre><code>public class FragmentTabs extends SherlockFragmentActivity {
      private TabHost     mTabHost;
      private ViewPager   mViewPager;
      private TabsAdapter mTabsAdapter;
  
      @Override
      protected void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
  
          setContentView(R.layout.fragment_tabs);
          mTabHost = (TabHost) findViewById(android.R.id.tabhost);
          mTabHost.setup();
  
          mViewPager = (ViewPager) findViewById(R.id.pager);
  
          mTabsAdapter = new TabsAdapter(this, mTabHost, mViewPager);
  
          // obviously THIS is the problem
          mTabsAdapter.addTab(mTabHost.newTabSpec("settings").setIndicator("Nastavitve"), Settings.NetSettingsPrefsFragment.class, null);
  
          if (savedInstanceState != null) {
              mTabHost.setCurrentTabByTag(savedInstanceState.getString("tab"));
          }
      }
  
      @Override
      protected void onSaveInstanceState(Bundle outState) {
          super.onSaveInstanceState(outState);
          outState.putString("tab", mTabHost.getCurrentTabTag());
      }
  
      public static class TabsAdapter extends FragmentPagerAdapter implements TabHost.OnTabChangeListener, ViewPager.OnPageChangeListener {
          private final Context               mContext;
          private final TabHost               mTabHost;
          private final ViewPager             mViewPager;
          private final ArrayList&lt;TabInfo&gt;    mTabs   = new ArrayList&lt;TabInfo&gt;();
  
          static final class TabInfo {
              //private final String  tag;
              private final Class&lt;?&gt;  clss;
              private final Bundle    args;
  
              TabInfo(String _tag, Class&lt;?&gt; _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 TabsAdapter(FragmentActivity activity, TabHost tabHost, ViewPager pager) {
              super(activity.getSupportFragmentManager());
              mContext = activity;
              mTabHost = tabHost;
              mViewPager = pager;
              mTabHost.setOnTabChangedListener(this);
              mViewPager.setAdapter(this);
              mViewPager.setOnPageChangeListener(this);
          }
  
          public void addTab(TabHost.TabSpec tabSpec, Class&lt;?&gt; clss, Bundle args) {
              tabSpec.setContent(new DummyTabFactory(mContext));
              String tag = tabSpec.getTag();
  
              TabInfo info = new TabInfo(tag, clss, args);
              mTabs.add(info);
              mTabHost.addTab(tabSpec);
              notifyDataSetChanged();
          }
  
          @Override
          public int getCount() {
              return mTabs.size();
          }
  
          @Override
          public Fragment getItem(int position) {
              TabInfo info = mTabs.get(position);
              return Fragment.instantiate(mContext, info.clss.getName(), info.args);
          }
  
          @Override
          public void onTabChanged(String tabId) {
              int position = mTabHost.getCurrentTab();
              mViewPager.setCurrentItem(position);
          }
  
          @Override
          public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {}
  
          @Override
          public void onPageSelected(int position) {
              // Unfortunately when TabHost changes the current tab, it kindly
              // also takes care of putting focus on it when not in touch mode.
              // The jerk.
              // This hack tries to prevent this from pulling focus out of our
              // ViewPager.
              TabWidget widget = mTabHost.getTabWidget();
              int oldFocusability = widget.getDescendantFocusability();
              widget.setDescendantFocusability(ViewGroup.FOCUS_BLOCK_DESCENDANTS);
              mTabHost.setCurrentTab(position);
              widget.setDescendantFocusability(oldFocusability);
          }
  
          @Override
          public void onPageScrollStateChanged(int state) {}
      }
  }
  </code></pre>