मैं कोड का उपयोग कर रहा हूं मुझे 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();
लेकिन न तो अब तक काम किया है।
धन्यवाद। क्या आप इन दो ओवरराइड को लागू नहीं करने के नतीजे साझा कर सकते हैं? क्या यह एक प्रदर्शन की बात है, या इसके परिणामस्वरूप गलत व्यवहार होगा? – JRun
मैं इन कार्यों को ओवरराइड करने के विचार को समझता हूं, ... लेकिन वास्तव में ViewPager से टैब को हटाने का क्या कॉल है? – gcl1
मेरा उपरोक्त प्रश्न @ jfritz42 को संबोधित करना था। धन्यवाद। – gcl1