2012-04-10 13 views
17

मैंने एक्शनबर्सहेलॉक + टैब + काम करने वाले टुकड़े पाने के लिए बहुत मेहनत की है।एक्शनबार्सहेलॉक + टैब + बहु टुकड़े?

मैं केवल इस सेट को स्थैतिक के रूप में काम करने के लिए बना सकता हूं, मैं इसे एंड्रॉइड मार्केट ऐप (स्वाइप मूवमेंट) की तरह बनाना चाहता हूं।

जब आप अंदर कई टुकड़ों के साथ लेआउट को बढ़ाने की आवश्यकता होती है तो मैं अटक जाता हूं।

समर्थन 4 डीमोस में, मुझे फ्रेगमेंट्स टैब्स पेजर का पालन करने के लिए उदाहरण मिला।

+0

यदि आपको कोई अपवाद फेंक दिया जा रहा है तो आपको उस कोड को पोस्ट करना होगा जिसमें आपको परेशानी हो रही है और आपके लॉगकाट को पोस्ट करना होगा। यदि आप 'Fragments' के बीच स्वाइप करना चाहते हैं तो आपको' ViewPager' का उपयोग करने की आवश्यकता है। – adneal

+0

https://github.com/JakeWharton/ActionBarSherlock/blob/master/samples/fragments/src/com/actionbarsherlock/sample/fragments/FragmentTabsPager.java –

उत्तर

10

आपको जो भी चाहते हैं उसे लागू करने के लिए आपको सही पुस्तकालयों की आवश्यकता है।

असल में, ViewPager लाइब्रेरी आपके से क्या गुम है। मेरे सुझाव:

1. ActionBarSherlock

यह इतना मृत आसान है कि मैं यह नहीं समझा जाएगा के साथ काम करने के लिए।

2. ViewPagerExtensions

आप इसे here पा सकते हैं। ज़िप फ़ाइलों को डाउनलोड करें और इससे एक नई परियोजना बनाएं।

मैं केवल के रूप में स्थिर काम करने के लिए इस सेट कर सकते हैं, मैं इस तरह Android Market एप्लिकेशन (Swype आंदोलन) बनाने के लिए चाहते हैं।

इस परियोजना से com.astuetz.viewpager.extensions.SwipeyTabsView लागू करें। आसान-से-पालन उदाहरण हैं। यह वही करता है जो आप चाहते हैं। यहां से चुनने के लिए अन्य टैब शैलियों भी हैं (आईसीएस के साथ आने वाले नए लोग टैब सहित)। इसके अलावा, इसे अपनी ऐप पहचान से मेल खाने के लिए शैली बनाना बहुत आसान है।

3. FragmentPagerAdapter

अंत में, समर्थन पुस्तकालय (v4) से उस वर्ग।

शुभकामनाएं, और मुझसे पूछने के लिए स्वतंत्र रहें कि आपको और सहायता चाहिए या नहीं।


आप आप उपयोग कर रहे हैं कि मैं क्या सुझाव दिया FragmentPagerAdapter में instantiateItem ओवरराइड करने के लिए जरूरत नहीं है। आपको केवल

  1. FragmentManager के साथ एक कन्स्ट्रक्टर प्रदान करें और सुपर कार्यान्वयन को कॉल करें;
  2. अवहेलना getCount अपने पेजर में टुकड़े की संख्या लौटने के लिए, और
  3. getItem, जो है कि तुम क्या निर्माण के लिए अपने टुकड़े वापस जाने के लिए इस्तेमाल करेंगे करने के लिए।

यह मेरे यहां मौजूद कोड का एक उदाहरण है (एक पूर्ण कामकाजी, उत्पादन उदाहरण)। यह गतिविधि कि पेजर लागू करता है करने के लिए एक आंतरिक वर्ग है:

static class MyFragmentPagerAdapter extends FragmentPagerAdapter { 

    public MyFragmentPagerAdapter(FragmentManager fm) { 
     super(fm); 
    } 

    @Override 
    public int getCount() { 
     return 2; 
    } 

    @Override 
    public Fragment getItem(int position) { 
     Fragment f; 
     switch(position) { 
     case 0: 
      f= new ItemSalesDataFragment(); 
      break; 
     case 1: 
      f= new DepartmentChooserFragment(); 
      break; 
     default: 
      throw new IllegalArgumentException("not this many fragments: " + position); 
     } 
     return f; 
    } 
} 

आप देख सकते हैं, इस पेजर दो 'पृष्ठ', बाईं प्रदर्शित करता है बिक्री डेटा संभालती है।सही व्यक्ति उपयोगकर्ता को कौन सा विभाग चुनने की अनुमति देता है। वे getItem विधि में वापस आ गए हैं। उचित टुकड़े (आप जो भी टुकड़े पहले से हैं, उसका उपयोग कर सकते हैं, कोई संशोधन आवश्यक नहीं है)।

जैसी उम्मीद थी, आप 1 से एक साथ यह सब में शामिल होने) एक वस्तु है कि दृष्टांत MyFragmentPagerAdapter बनाने, और 2) अपने ViewPager वस्तु के लिए एडाप्टर की स्थापना उस वर्ग है कि आप बस instantiated किया जाना है। जैसा कि आप देख सकते हैं, इसकी getItem विधि पेजर को आपके सभी आवश्यक टुकड़ों को "दे" देगी। उदाहरण:

mFragmentPagerAdapter = new MyFragmentPagerAdapter(getSupportFragmentManager()); 
mViewPager.setAdapter(mFragmentPagerAdapter); 

बेशक , वहाँ अन्य बातों के लिए खुद को टैब बटन बनाने और पार संवाद करने के लिए यह सब में शामिल होने की तरह है, ऐसा करने के लिए कर रहे हैं। मैं आपको ViewPagerExtensions ज़िप फ़ाइल में प्रदान किए गए उदाहरणों को देखने का सुझाव देता हूं जिन्हें आप गिटहब से डाउनलोड करते हैं। यह सिर्फ आपकी टिप्पणी में प्रश्न का उत्तर है। जैसा कि आप देख सकते हैं, यह पुस्तकालय का उपयोग करके इतना कोड नहीं है।

+0

मैं अनुशंसा करता हूं कि ViewPagerExtensions लाइब्रेरी क्योंकि मुझे जेनरेट कोड पसंद आया, और यह भी क्योंकि यह स्टाइल के लिए बहुत आसान होने के अलावा, कुछ अलग-अलग टैब प्रकार प्रदान करता है जिन्हें आप चुन सकते हैं। यदि आप रिमनल दृष्टिकोण को सीमित कर पाते हैं जो आप कर सकते हैं, तो इसे आज़माएं। – davidcesarino

+0

धन्यवाद, यह वास्तव में मदद करता है। अब मुझे सीखना होगा कि अंदर प्रत्येक स्थिति के लिए दो लेआउट कैसे बढ़ाएं: ऑब्जेक्ट इंस्टीट्यूट इटिम (कंटेनर, int स्थिति देखें), क्या आपके पास कोई ट्यूटोरियल है? thx – Marckaraujo

+0

आपके द्वारा आवश्यक टुकड़ों को वापस करने के लिए आप 'FragmentpagerAdapter' का उपयोग करने के तरीके का एक उदाहरण दिखाने के लिए अद्यतन उत्तर दिया। अगर आपको किसी अन्य मदद की ज़रूरत है, तो पूछने के लिए स्वतंत्र रहें। – davidcesarino

38

मैं वास्तव में एबीएस पुस्तकालय और समर्थन पुस्तकालय से कुछ भी बिना काम करने में कामयाब रहा। यहां मेरा कोड है:

public class ActionBarTabs extends SherlockFragmentActivity { 
CustomViewPager mViewPager; 
TabsAdapter mTabsAdapter; 
TextView tabCenter; 
TextView tabText; 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, 
      WindowManager.LayoutParams.FLAG_FULLSCREEN); 

    mViewPager = new CustomViewPager(this); 
    mViewPager.setId(R.id.pager); 

    setContentView(mViewPager); 
    ActionBar bar = getSupportActionBar(); 
    bar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); 
    bar.setDisplayOptions(0, ActionBar.DISPLAY_SHOW_TITLE); 

    mTabsAdapter = new TabsAdapter(this, mViewPager); 

    mTabsAdapter.addTab(bar.newTab().setText("Home"), 
      ToolKitFragment.class, null); 
    mTabsAdapter.addTab(bar.newTab().setText("FujiSan"), 
      FujiFragment.class, null); 
} 

public static class TabsAdapter extends FragmentPagerAdapter implements 
     ActionBar.TabListener, ViewPager.OnPageChangeListener { 
    private final Context mContext; 
    private final ActionBar mActionBar; 
    private final ViewPager mViewPager; 
    private final ArrayList<TabInfo> mTabs = new ArrayList<TabInfo>(); 

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

     TabInfo(Class<?> _class, Bundle _args) { 
      clss = _class; 
      args = _args; 
     } 
    } 

    public TabsAdapter(SherlockFragmentActivity activity, ViewPager pager) { 
     super(activity.getSupportFragmentManager()); 
     mContext = activity; 
     mActionBar = activity.getSupportActionBar(); 
     mViewPager = pager; 
     mViewPager.setAdapter(this); 
     mViewPager.setOnPageChangeListener(this); 
    } 

    public void addTab(ActionBar.Tab tab, Class<?> clss, Bundle args) { 
     TabInfo info = new TabInfo(clss, args); 
     tab.setTag(info); 
     tab.setTabListener(this); 
     mTabs.add(info); 
     mActionBar.addTab(tab); 
     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 onPageScrolled(int position, float positionOffset, 
      int positionOffsetPixels) { 
    } 

    @Override 
    public void onPageSelected(int position) { 
     mActionBar.setSelectedNavigationItem(position); 
    } 

    @Override 
    public void onPageScrollStateChanged(int state) { 
    } 

    @Override 
    public void onTabSelected(Tab tab, FragmentTransaction ft) { 
     Object tag = tab.getTag(); 
     for (int i = 0; i < mTabs.size(); i++) { 
      if (mTabs.get(i) == tag) { 
       mViewPager.setCurrentItem(i); 
      } 
     } 
    } 

    @Override 
    public void onTabUnselected(Tab tab, FragmentTransaction ft) { 
    } 

    @Override 
    public void onTabReselected(Tab tab, FragmentTransaction ft) { 
    } 
} 
} 

आप निम्न पर आधारित अपनी टैब सामग्री लोड करते हैं।

mTabsAdapter.addTab(bar.newTab().setText("Home"), 
      YOURFRAGMENTHERE.class, null); 

इस रूप में आप एबीएस, समर्थन पुस्तकालय और टुकड़े के साथ यह उल्लेख करने के लिए, आप सुंदर "swipey टैब" प्रभाव, दे देंगे। एबीएस वास्तव में मूल पुस्तकालयों के साथ काम करने के समान ही बनाता है। मैंने वास्तव में गूगल्स पेजिंग टैब उदाहरण से सीधे इस कोड की प्रतिलिपि बनाई और एबीएस के लिए इसे कभी भी थोड़ा संशोधित किया।

आशा है कि इससे मदद मिलती है!

+1

खैर, मैं इसे समझ सकता था, लेकिन मेरी समस्या खंड वर्ग है, यह हमेशा दुर्घटनाग्रस्त हो जाती है, क्या आप कृपया इस तरह के टुकड़े वर्ग को अंदर या दो से अधिक टुकड़ों के साथ बनाने का तरीका बता सकते हैं? thx – Marckaraujo

+0

कमाल। धन्यवाद। एबीएस के साथ आने वाले उदाहरणों की तुलना में काफी बेहतर है क्योंकि यह एबीएस उदाहरण के विपरीत सुंदर, नए आईसीएस टैब के साथ टुकड़े देता है जो टुकड़े –

+2

का उपयोग करते समय पुराने टैब पर वापस आते हैं नमूना कोड के लिए धन्यवाद, यह वही है जो मैं था खोज रहे हैं! एक बात है हालांकि मुझे समझ में नहीं आता है, "CustomViewPager" के लिए क्या अच्छा है? ऐसा लगता है कि डिफ़ॉल्ट व्यूपेजर के साथ भी ठीक काम करता है। – Glenn85

3

कई उदाहरण आमतौर पर पहले चयनित टैब पर स्विच करते समय एक अपवाद (IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first) फेंक देते हैं।

मैं एक सादे FragmentPageAdapter के बजाय FragmentStatePageAdapter के साथ Google के उदाहरण को अनुकूलित करना चाहता हूं, जो आपके लिए टुकड़े को प्रतिस्थापित करेगा और इस त्रुटि को हल करेगा। आम तौर पर यह उन टुकड़ों को नष्ट कर देगा जिन्हें माना जाता है कि अंतरिक्ष को बचाने के लिए हटाया जा सकता है; यदि आप हमेशा अपने टुकड़ों को पकड़ना चाहते हैं तो खाली ब्लॉक के साथ destroyItem(ViewGroup, int, Object) ओवरराइड करें।

public class ActionBarTabs extends SherlockFragmentActivity { 
    CustomViewPager mViewPager; 
    TabsAdapter mTabsAdapter; 
    TextView tabCenter; 
    TextView tabText; 
    ActionBar mActionBar; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, 
      WindowManager.LayoutParams.FLAG_FULLSCREEN); 

     mViewPager = new CustomViewPager(this); 
     mViewPager.setId(R.id.pager); 

     setContentView(mViewPager); 
     mActionBar = getSupportActionBar(); 
     mActionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); 
     mActionBar.setDisplayOptions(0, ActionBar.DISPLAY_SHOW_TITLE); 

     mTabsAdapter = new TabsAdapter(this, mViewPager); 

     mTabsAdapter.addTab(mActionBar.newTab().setText("Page 1"), 
      YOURFRAGMENT_A.class, null); 
     mTabsAdapter.addTab(mActionBar.newTab().setText("Page 2"), 
      YOURFRAGMENT_B.class, null); 
     mTabsAdapter.addTab(mActionBar.newTab().setText("Page 3"), 
      YOURFRAGMENT_C.class, null); 
    } 

    public static class TabsAdapter extends FragmentPagerAdapter 
      implements ActionBar.TabListener, ViewPager.OnPageChangeListener { 
     private final Context mContext; 
     private final ActionBar mActionBar; 
     private final ViewPager mViewPager; 
     private final ArrayList<TabInfo> mTabs = new ArrayList<TabInfo>(); 

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

      TabInfo(Class<?> _class, Bundle _args) { 
       clss = _class; 
       args = _args; 
      } 
     } 

     public TabsAdapter(SherlockFragmentActivity activity, ViewPager pager) { 
      super(activity.getSupportFragmentManager()); 
      mContext = activity; 
      mActionBar = activity.getSupportActionBar(); 
      mViewPager = pager; 
      mViewPager.setAdapter(this); 
      mViewPager.setOnPageChangeListener(this); 
     } 

     public void addTab(ActionBar.Tab tab, Class<?> clss, Bundle args) { 
      TabInfo info = new TabInfo(clss, args); 
      tab.setTag(info); 
      tab.setTabListener(this); 
      mTabs.add(info); 
      mActionBar.addTab(tab); 
      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 onPageScrolled(int position, float positionOffset, 
      int positionOffsetPixels) { 
     } 

     @Override 
     public void onPageSelected(int position) { 
      mActionBar.setSelectedNavigationItem(position); 
     } 

     @Override 
     public void onPageScrollStateChanged(int state) { 
     } 

     @Override 
     public void onTabSelected(Tab tab, FragmentTransaction ft) { 
      Object tag = tab.getTag(); 
      for (int i = 0; i < mTabs.size(); i++) { 
       if (mTabs.get(i) == tag) { 
        mViewPager.setCurrentItem(i); 
       } 
      } 
     } 

     @Override 
     public void onTabUnselected(Tab tab, FragmentTransaction ft) { 
     } 

     @Override 
     public void onTabReselected(Tab tab, FragmentTransaction ft) { 
     } 
    } 
} 

एबीएस के साथ अच्छी तरह से काम करता है और अपेक्षाकृत लागू करने के लिए सरल है:

यहाँ एक उदाहरण है।

संबंधित मुद्दे