2013-04-18 28 views
3

我試圖用一個ViewPager使用ABS SherlockFragmentActivity來製作一個標籤式活動,並希望其中一個選項卡包含一個首選活動/片段。在帶標籤的SherlockFragmentActivity中使用PreferenceFragment

由於ABS沒有一個SherlockPreferenceFragment,或任何形式的對PreferenceFragment支持,我found使用可能的解決方案UnifiedPreference

UnifiedPreference適用於它自己的,演示的偉大工程,但如果我嘗試實現它在我ActionBarSherlock供電的標籤,它崩潰與消息:

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) 

它看起來像UnifiedPreferenceFragment沒有延伸android.support.v4.app.Fragment。 有沒有辦法解決這個問題?有沒有人設法得到一個工作的例子?

我當前的代碼是:

設置:

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 {} 
} 

分頁活動:

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<TabInfo> mTabs = new ArrayList<TabInfo>(); 

     static final class TabInfo { 
      //private final String tag; 
      private final Class<?> clss; 
      private final Bundle args; 

      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 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<?> 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) {} 
    } 
} 
+0

我有和你一樣的問題。你有沒有找到解決辦法? – MrMaffen

+0

還沒有,還在等待幫助。 – jean

回答

1

我還需要之前蜂窩實現PreferenceFragment中的Android版本(API等級11) 。就像你已經有的那樣,我發現了UnifiedPreference庫,但是看到源代碼,我發現UnifiedPreferenceFragment從官方的Android API擴展了PreferenceFragment,因此不適用於API級別爲<。

這是我找到的另一個類在那裏,但我沒有測試它尚未:

希望它能幫助!

您是否發現了另一種解決方案?希望Android的人將很快將這個類添加到支持庫!

乾杯,

+0

我試過PrefereceListFragment類,效果很好!在鏈接中還有一個示例實現來指導您更多。 順便說一句,我擴展SherlockListFragment而不是ListFragment,也工作。所以這個課程有無縫的ABS支持。 – callmesouky