5

मैं कोड का उपयोग कर रहा हूं मुझे here मिला।एक्शनबार, व्यूअरजर और एकाधिक टुकड़ों के साथ एक टैब को कैसे हटाएं?

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

मैं इसे संशोधित करने की कोशिश कर रहा हूं ताकि मैं गतिशील रूप से टैब हटा सकूं। मैंने बस इस फ़ंक्शन को बनाने की कोशिश की:

public void removeTab(ActionBar.Tab tab) { 
     mTabs.remove(tab); 
     mActionBar.removeTab(tab); 
     notifyDataSetChanged(); 
    } 

लेकिन मुझे हमेशा इंडेक्सआउटफॉउंडसेप्शन मिलता है। क्या किसी को ऐसा करने का अच्छा तरीका पता है?

संपादित

करने के लिए अपने विधि बदलकर:

public void removeTab(ActionBar.Tab tab) { 
     mTabs.remove(tab.getTag()); 
     mActionBar.removeTab(tab); 
     notifyDataSetChanged(); 
    } 

मैं सफलतापूर्वक टैब को दूर करने में सक्षम था। हालांकि, जब मैं एक टैब को हटाता हूं जो दूर दाईं ओर नहीं है, तो टैब (या खंड?) जो टैब से जुड़ा था, दूर नहीं जाता है। इसके बजाय, यह अगले उच्चतम टैब से जुड़ा हुआ प्रतीत होता है। उदाहरण के लिए, यदि मैंने टैब 0 हटा दिया है, तो टैब 0 का दृश्य केवल टैब 1 पर जाता है। यदि मैं उच्चतम आईडी वाला टैब हटा देता हूं तो टैब और दृश्य सही ढंग से चले जाते हैं लेकिन फिर जब मैं एक नया टैब जोड़ता हूं तो वापस आ जाता है।

ऐसा लगता है कि टैब के साथ जुड़े हुए टुकड़ों की एक सूची है और टैब को हटाने से खंड को हटाया नहीं जाता है। क्या किसी को कोई विचार है कि इसका क्या कारण है?

EDIT2

मैं के साथ टुकड़े को हटाने के लिए कोशिश की है:

  Fragment fragmentToRemove = getItem(tab.getPosition()); 
      destroyItem(mViewPager, tab.getPosition(), fragmentToRemove); 

और भी

 Fragment fragmentToRemove = getItem(tab.getPosition()); 
     FragmentTransaction fragmentTransaction = mActivity 
       .getSupportFragmentManager().beginTransaction(); 
     fragmentTransaction.remove(fragmentToRemove); 
     fragmentTransaction.commit(); 

लेकिन न तो अब तक काम किया है।

उत्तर

8

समझ गया!

public void removeTab(ActionBar.Tab tab) { 
    mTabs.remove(tab.getTag()); 
    mActionBar.removeTab(tab); 
    notifyDataSetChanged(); 
} 

और पूरी तरह से destroyItem

@Override 
    public void destroyItem(ViewGroup container, int position, Object object) { 
     // TODO Auto-generated method stub 
     super.destroyItem(container, position, object); 
     FragmentManager manager = ((Fragment) object).getFragmentManager(); 
     FragmentTransaction trans = manager.beginTransaction(); 
     trans.remove((Fragment) object); 
     trans.commit(); 
    } 
ओवरराइड

वर्क्स !!!

4

मैं बस आज पता चला कि समर्थन करने के लिए असली चाल डालने या टैब को हटाने FragmentPagerAdapter.getItemPosition() ओवरराइड करने के लिए है:

@Override 
public int getItemPosition(Object object) { 
    Fragment fragment = (Fragment) object; 
    for (int i = 0; i < tabInfos.size(); i++) { 
     if (tabInfos.get(i).clss == fragment.getClass()) { 
      return i; 
     } 
    } 
    // The tab must have been removed 
    return POSITION_NONE; 
} 

getItemPosition()ViewPager द्वारा बुलाया जाएगा के बाद आप notifyDataSetChanged() कहा जाता है (/ हटाने के टैब जोड़ने के बाद)। ViewPager इस एडाप्टर के साथ अपने कैश को पुन: संसाधित करने का प्रयास कर रहा है। यह प्रत्येक 'ऑब्जेक्ट' (टुकड़ा) के लिए getItemPosition() पर कॉल करता है, और हम इसे बताते हैं कि फ्रैगमेंट किस स्थिति से है। यदि कोई मिलान नहीं है, तो ऐसा इसलिए है क्योंकि हमने उस टैब को हटा दिया है, इसलिए POSITION_NONE लौटाएं।

यदि आपने टैब डालें या हटा दिया है तो मुझे FragmentPagerAdapter.getItemId() ओवरराइड करना भी महत्वपूर्ण है, क्योंकि टुकड़े बाएं और दाएं स्थानांतरित हो जाएंगे। इस विधि को FragmentPagerAdapter.instantiateItem() द्वारा बुलाया जाता है और आइटम के लिए नाम (स्ट्रिंग) में जोड़ा जाता है। यह इस नाम का उपयोग एक मौजूदा नाम के साथ पूर्व-मौजूदा खंडन को देखने के लिए करता है (यदि कोई है तो) अन्यथा एक नया प्रारंभ करें।यहां कुछ कोड दिया गया है:

@Override 
public long getItemId(int position) { 
    TabInfo info = tabInfos.get(position); 
    // The default hashCode() implementation is based on memory address, which will be unique 
    int hash = info.clss.hashCode(); 
    return hash; 
} 
+0

धन्यवाद। क्या आप इन दो ओवरराइड को लागू नहीं करने के नतीजे साझा कर सकते हैं? क्या यह एक प्रदर्शन की बात है, या इसके परिणामस्वरूप गलत व्यवहार होगा? – JRun

+0

मैं इन कार्यों को ओवरराइड करने के विचार को समझता हूं, ... लेकिन वास्तव में ViewPager से टैब को हटाने का क्या कॉल है? – gcl1

+0

मेरा उपरोक्त प्रश्न @ jfritz42 को संबोधित करना था। धन्यवाद। – gcl1