package com.lean56.andplug.activity;
import android.os.Bundle;
import android.support.v4.view.PagerAdapter;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.ImageView;
import android.widget.TabHost;
import android.widget.TabHost.OnTabChangeListener;
import android.widget.TabHost.TabContentFactory;
import android.widget.TabHost.TabSpec;
import android.widget.TextView;
import com.lean56.andplug.R;
import com.lean56.andplug.fragment.FragmentProvider;
import com.lean56.andplug.view.ViewPager;
import com.lean56.andplug.utils.ViewUtils;
/**
* Activity with tabbed pages
*
* @param <V>
*/
public abstract class TabPagerActivity<V extends PagerAdapter & FragmentProvider> extends PagerActivity implements OnTabChangeListener, TabContentFactory {
private static final int OFFSCREEN_PAGES = 3;
/**
* View pager
*/
protected ViewPager pager;
/**
* Tab host
*/
protected TabHost host;
/**
* Pager adapter
*/
protected V adapter;
@Override
public void onPageSelected(final int position) {
super.onPageSelected(position);
host.setCurrentTab(position);
}
@Override
public void onTabChanged(String tabId) {
updateCurrentItem(host.getCurrentTab());
}
@Override
public View createTabContent(String tag) {
return ViewUtils.setGone(new View(getApplication()), true);
}
/**
* Create pager adapter
*
* @return pager adapter
*/
protected abstract V createAdapter();
/**
* Get title for position
*
* @param position
* @return title
*/
protected String getTitle(final int position) {
return adapter.getPageTitle(position).toString();
}
/**
* Get icon for position
*
* @param position
* @return iconResId
*/
protected int getIcon(final int position) {
return 0;
}
/**
* Set tab and pager as gone or visible
*
* @param gone
* @return this activity
*/
protected TabPagerActivity<V> setGone(boolean gone) {
ViewUtils.setGone(host, gone);
ViewUtils.setGone(pager, gone);
return this;
}
/**
* Set current item to new position
* <p>
* This is guaranteed to only be called when a position changes and the
* current item of the pager has already been updated to the given position
* <p>
* Sub-classes may override this method
*
* @param position
*/
protected void setCurrentItem(final int position) {
// Intentionally left blank
}
/**
* Get content view to be used when {@link #onCreate(Bundle)} is called
*
* @return layout resource id
*/
@Override
protected int getContentView() {
return R.layout.pager_with_tabs;
}
private void updateCurrentItem(final int newPosition) {
if (newPosition > -1 && newPosition < adapter.getCount()) {
pager.setItem(newPosition);
setCurrentItem(newPosition);
}
}
private void createPager() {
adapter = createAdapter();
invalidateOptionsMenu();
pager.setAdapter(adapter);
}
/**
* Create tab using information from current adapter
* <p>
* This can be called when the tabs changed but must be called after an
* initial call to {@link #configureTabPager()}
*/
protected void createTabs() {
if (host.getTabWidget().getTabCount() > 0) {
// Crash on Gingerbread if tab isn't set to zero since adding a
// new tab removes selection state on the old tab which will be
// null unless the current tab index is the same as the first
// tab index being added
host.setCurrentTab(0);
host.clearAllTabs();
}
LayoutInflater inflater = getLayoutInflater();
int count = adapter.getCount();
for (int i = 0; i < count; i++) {
TabSpec spec = host.newTabSpec("tab" + i);
spec.setContent(this);
View view = inflater.inflate(R.layout.tabwidget, null);
ImageView icon = (ImageView) view.findViewById(R.id.tab_icon);
TextView title = (TextView) view.findViewById(R.id.tab_title);
int iconText = getIcon(i);
if (0 != iconText) {
icon.setImageResource(getIcon(i));
} else {
ViewUtils.setGone(icon, true);
}
title.setText(getTitle(i));
spec.setIndicator(view);
host.addTab(spec);
}
}
/**
* Configure tabs and pager
*/
protected void configureTabPager() {
if (adapter == null) {
createPager();
createTabs();
}
}
/**
* Configure tabs and pager
*/
public void switchToTab(int position) {
host.setCurrentTab(position);
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// setup ViewPager
pager = (ViewPager) findViewById(R.id.vp_pages);
pager.setOnPageChangeListener(this);
// keep all fragment alive in the life cycle
pager.setOffscreenPageLimit(OFFSCREEN_PAGES);
pager.setScrollable(false);
//set up TabHost
host = (TabHost) findViewById(android.R.id.tabhost);
host.setup();
host.setOnTabChangedListener(this);
}
@Override
protected FragmentProvider getProvider() {
return adapter;
}
}