diff options
Diffstat (limited to 'android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/app/TabSwipeFragment.java')
-rw-r--r-- | android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/app/TabSwipeFragment.java | 305 |
1 files changed, 305 insertions, 0 deletions
diff --git a/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/app/TabSwipeFragment.java b/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/app/TabSwipeFragment.java new file mode 100644 index 0000000000..705a33b1c2 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/app/TabSwipeFragment.java @@ -0,0 +1,305 @@ + +package org.holoeverywhere.app; + +import java.util.ArrayList; +import java.util.List; + +import org.holoeverywhere.ITabSwipe; +import org.holoeverywhere.LayoutInflater; +import org.holoeverywhere.R; +import org.holoeverywhere.app.TabSwipeFragment.TabInfo; + +import android.os.Bundle; +import android.support.v4.app.FragmentStatePagerAdapter; +import android.support.v4.app.FragmentTransaction; +import android.support.v4.view.ViewPager; +import android.support.v4.view.ViewPager.OnPageChangeListener; +import android.view.View; +import android.view.ViewGroup; + +import com.actionbarsherlock.app.ActionBar; +import com.actionbarsherlock.app.ActionBar.Tab; +import com.actionbarsherlock.app.ActionBar.TabListener; + +/** + * This fragment class implement tabs + swipe navigation pattern<br /> + * <br /> + * Part of HoloEverywhere + */ +public abstract class TabSwipeFragment extends Fragment implements ITabSwipe<TabInfo> { + public static class TabInfo implements ITabSwipe.TabInfo { + public Bundle fragmentArguments; + public Class<? extends Fragment> fragmentClass; + public CharSequence title; + + @Override + public Bundle getFragmentArguments() { + return fragmentArguments; + } + + @Override + public Class<? extends Fragment> getFragmentClass() { + return fragmentClass; + } + + @Override + public CharSequence getTitle() { + return title; + } + + @Override + public void setFragmentArguments(Bundle fragmentArguments) { + this.fragmentArguments = fragmentArguments; + } + + @Override + public void setFragmentClass(Class<? extends Fragment> fragmentClass) { + this.fragmentClass = fragmentClass; + } + + @Override + public void setTitle(CharSequence title) { + this.title = title; + } + } + + private final class TabSwipeAdapter extends FragmentStatePagerAdapter implements + OnPageChangeListener, TabListener { + public TabSwipeAdapter() { + super(getChildFragmentManager()); + } + + @Override + public int getCount() { + return mTabs.size(); + } + + @Override + public Fragment getItem(int position) { + final TabInfo info = mTabs.get(position); + return Fragment.instantiate(info.fragmentClass, info.fragmentArguments); + } + + @Override + public void onPageScrolled(int position, float percent, int pixels) { + // Do nothing + } + + @Override + public void onPageScrollStateChanged(int scrollState) { + // Do nothing + } + + @Override + public void onPageSelected(int position) { + dispatchTabSelected(position); + } + + @Override + public void onTabReselected(Tab tab, FragmentTransaction ft) { + // Do nothing + } + + @Override + public void onTabSelected(Tab tab, FragmentTransaction ft) { + dispatchTabSelected(tab.getPosition()); + } + + @Override + public void onTabUnselected(Tab tab, FragmentTransaction ft) { + // Do nothing + } + } + + private TabSwipeAdapter mAdapter; + private int mCustomLayout = -1; + private OnTabSelectedListener mOnTabSelectedListener; + private int mPrevNavigationMode = ActionBar.NAVIGATION_MODE_STANDARD; + private boolean mSmoothScroll = true; + private List<TabInfo> mTabs = new ArrayList<TabInfo>(); + + private ViewPager mViewPager; + + @Override + public TabInfo addTab(CharSequence title, Class<? extends Fragment> fragmentClass) { + return addTab(title, fragmentClass, null); + } + + @Override + public TabInfo addTab(CharSequence title, Class<? extends Fragment> fragmentClass, + Bundle fragmentArguments) { + TabInfo info = new TabInfo(); + info.title = title; + info.fragmentClass = fragmentClass; + info.fragmentArguments = fragmentArguments; + return addTab(info); + } + + @Override + public TabInfo addTab(int title, Class<? extends Fragment> fragmentClass) { + return addTab(getText(title), fragmentClass, null); + } + + @Override + public TabInfo addTab(int title, Class<? extends Fragment> fragmentClass, + Bundle fragmentArguments) { + return addTab(getText(title), fragmentClass, fragmentArguments); + } + + @Override + public TabInfo addTab(TabInfo tabInfo) { + mTabs.add(tabInfo); + getSupportActionBar().addTab(makeActionBarTab(tabInfo)); + notifyChanged(); + return tabInfo; + } + + @Override + public TabInfo addTab(TabInfo tabInfo, int position) { + mTabs.add(position, tabInfo); + getSupportActionBar().addTab(makeActionBarTab(tabInfo), position); + notifyChanged(); + return tabInfo; + } + + private void dispatchTabSelected(int position) { + boolean notify = false; + if (mViewPager.getCurrentItem() != position) { + mViewPager.setCurrentItem(position, mSmoothScroll); + notify = true; + } + if (getSupportActionBar().getSelectedNavigationIndex() != position) { + getSupportActionBar().selectTab(getSupportActionBar().getTabAt(position)); + notify = true; + } + if (notify) { + onTabSelected(position); + } + } + + @Override + public OnTabSelectedListener getOnTabSelectedListener() { + return mOnTabSelectedListener; + } + + @Override + public boolean isSmoothScroll() { + return mSmoothScroll; + } + + protected Tab makeActionBarTab(TabInfo tabInfo) { + Tab tab = getSupportActionBar().newTab(); + tab.setText(tabInfo.title); + tab.setTabListener(mAdapter); + return tab; + } + + private void notifyChanged() { + if (mAdapter != null) { + mAdapter.notifyDataSetChanged(); + } + } + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { + return inflater.inflate(mCustomLayout > 0 ? mCustomLayout : R.layout.tab_swipe, container, + false); + } + + @Override + public void onDestroyView() { + getSupportActionBar().removeAllTabs(); + getSupportActionBar().setNavigationMode(mPrevNavigationMode); + super.onDestroyView(); + } + + /** + * Add your tabs here + */ + protected abstract void onHandleTabs(); + + public void onTabSelected(int position) { + if (mOnTabSelectedListener != null) { + mOnTabSelectedListener.onTabSelected(position); + } + } + + @Override + public void onViewCreated(View view, Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); + mViewPager = (ViewPager) view.findViewById(R.id.tabSwipePager); + if (mViewPager == null) { + throw new IllegalStateException( + "Add ViewPager to your custom layout with id @id/tabSwipePager"); + } + if (getSupportActionBar().getTabCount() > 0) { + throw new IllegalStateException( + "TabSwipeFragment doesn't support multitabbed fragments"); + } + mAdapter = new TabSwipeAdapter(); + onHandleTabs(); + mViewPager.setAdapter(mAdapter); + mViewPager.setOnPageChangeListener(mAdapter); + mPrevNavigationMode = getSupportActionBar().getNavigationMode(); + getSupportActionBar().setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); + } + + @Override + public void reloadTabs() { + removeAllTabs(); + onHandleTabs(); + } + + @Override + public void removeAllTabs() { + getSupportActionBar().removeAllTabs(); + mTabs.clear(); + notifyChanged(); + } + + @Override + public TabInfo removeTab(int position) { + TabInfo tabInfo = mTabs.remove(position); + getSupportActionBar().removeTabAt(position); + notifyChanged(); + return tabInfo; + } + + @Override + public TabInfo removeTab(TabInfo tabInfo) { + for (int i = 0; i < mTabs.size(); i++) { + if (mTabs.get(i) == tabInfo) { + return removeTab(i); + } + } + return tabInfo; + } + + @Override + public void setCurrentTab(int position) { + dispatchTabSelected(Math.min(0, Math.max(position, mTabs.size() - 1))); + } + + /** + * If you want custom layout for this activity - call this method before + * super.onCreate<br /> + * Your layout should be contains ViewPager with id @id/tabSwipePager + */ + @Override + public void setCustomLayout(int customLayout) { + mCustomLayout = customLayout; + } + + @Override + public void setOnTabSelectedListener(OnTabSelectedListener onTabSelectedListener) { + mOnTabSelectedListener = onTabSelectedListener; + } + + /** + * Smooth scroll of ViewPager when user click on tab + */ + @Override + public void setSmoothScroll(boolean smoothScroll) { + mSmoothScroll = smoothScroll; + } +} |