2013-04-18 2 views
3

Я пытаюсь сделать вкладку с использованием ABS SherlockFragmentActivity с ViewPager и хотел бы, чтобы одна из вкладок содержала активность/фрагмент предпочтения.Использование PreferenceFragment в SherlockFragmentActivity с вкладками

Как 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 до версии Honeycomb (уровень API 11) , Как вы уже знаете, я нашел библиотеку UnifiedPreference, но, глядя на исходный код, я вижу, что UnifiedPreferenceFragment расширяет PreferenceFragment из официального Android API, поэтому не работает для уровня API <.

Это еще один класс, который я нашел там, но я не проверял еще:

Надеется, что это помогает!

Вы нашли другое решение? Надеемся, что Android-разработчик скоро добавит этот класс в библиотеку поддержки!

Cheers,

+0

Я пробовал класс PrefereceListFragment и отлично работает! В ссылке есть также пример реализации, который поможет вам немного больше. BTW, я расширил SherlockListFragment вместо ListFragment, а также работал. Таким образом, для этого класса есть бесшовная поддержка ABS. – callmesouky

Смежные вопросы