1be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn/* 2be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn * Copyright (C) 2011 The Android Open Source Project 3be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn * 4be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn * Licensed under the Apache License, Version 2.0 (the "License"); 5be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn * you may not use this file except in compliance with the License. 6be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn * You may obtain a copy of the License at 7be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn * 8be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn * http://www.apache.org/licenses/LICENSE-2.0 9be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn * 10be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn * Unless required by applicable law or agreed to in writing, software 11be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn * distributed under the License is distributed on an "AS IS" BASIS, 12be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn * See the License for the specific language governing permissions and 14be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn * limitations under the License. 15be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn */ 16be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackbornpackage com.example.android.supportv13.app; 17be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn 18be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackbornimport java.util.ArrayList; 19be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn 20be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackbornimport com.example.android.supportv13.R; 21be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn 22be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackbornimport android.app.ActionBar; 23be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackbornimport android.app.ActionBar.Tab; 24be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackbornimport android.app.Activity; 25be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackbornimport android.app.Fragment; 26be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackbornimport android.app.FragmentTransaction; 27be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackbornimport android.content.Context; 28be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackbornimport android.os.Bundle; 29be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackbornimport android.support.v13.app.FragmentPagerAdapter; 30be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackbornimport android.support.v4.view.ViewPager; 31be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn 32be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn/** 33be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn * This demonstrates the use of action bar tabs and how they interact 34be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn * with other action bar features. 35be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn */ 36e0c8f946e671a97b5c40cb6584ab00afd6f0b548Dianne Hackborn//BEGIN_INCLUDE(complete) 37be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackbornpublic class ActionBarTabsPager extends Activity { 38be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn ViewPager mViewPager; 39be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn TabsAdapter mTabsAdapter; 40be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn 41be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn @Override 42be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn protected void onCreate(Bundle savedInstanceState) { 43be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn super.onCreate(savedInstanceState); 44be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn 45be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn mViewPager = new ViewPager(this); 46be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn mViewPager.setId(R.id.pager); 47be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn setContentView(mViewPager); 48be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn 49be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn final ActionBar bar = getActionBar(); 50be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn bar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); 51be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn bar.setDisplayOptions(0, ActionBar.DISPLAY_SHOW_TITLE); 52be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn 53be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn mTabsAdapter = new TabsAdapter(this, mViewPager); 54be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn mTabsAdapter.addTab(bar.newTab().setText("Simple"), 55be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn CountingFragment.class, null); 56be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn mTabsAdapter.addTab(bar.newTab().setText("List"), 57be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn FragmentPagerSupport.ArrayListFragment.class, null); 58be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn mTabsAdapter.addTab(bar.newTab().setText("Cursor"), 59be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn CursorFragment.class, null); 60be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn 61be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn if (savedInstanceState != null) { 62be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn bar.setSelectedNavigationItem(savedInstanceState.getInt("tab", 0)); 63be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn } 64be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn } 65be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn 66be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn @Override 67be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn protected void onSaveInstanceState(Bundle outState) { 68be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn super.onSaveInstanceState(outState); 69be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn outState.putInt("tab", getActionBar().getSelectedNavigationIndex()); 70be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn } 71be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn 72be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn /** 73be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn * This is a helper class that implements the management of tabs and all 74be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn * details of connecting a ViewPager with associated TabHost. It relies on a 75be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn * trick. Normally a tab host has a simple API for supplying a View or 76be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn * Intent that each tab will show. This is not sufficient for switching 77be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn * between pages. So instead we make the content part of the tab host 78be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn * 0dp high (it is not shown) and the TabsAdapter supplies its own dummy 79be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn * view to show as the tab content. It listens to changes in tabs, and takes 80be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn * care of switch to the correct paged in the ViewPager whenever the selected 81be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn * tab changes. 82be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn */ 83be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn public static class TabsAdapter extends FragmentPagerAdapter 84be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn implements ActionBar.TabListener, ViewPager.OnPageChangeListener { 85be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn private final Context mContext; 86be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn private final ActionBar mActionBar; 87be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn private final ViewPager mViewPager; 88be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn private final ArrayList<TabInfo> mTabs = new ArrayList<TabInfo>(); 89be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn 90be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn static final class TabInfo { 91be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn private final Class<?> clss; 92be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn private final Bundle args; 93be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn 94be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn TabInfo(Class<?> _class, Bundle _args) { 95be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn clss = _class; 96be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn args = _args; 97be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn } 98be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn } 99be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn 100be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn public TabsAdapter(Activity activity, ViewPager pager) { 101be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn super(activity.getFragmentManager()); 102be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn mContext = activity; 103be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn mActionBar = activity.getActionBar(); 104be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn mViewPager = pager; 105be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn mViewPager.setAdapter(this); 106be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn mViewPager.setOnPageChangeListener(this); 107be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn } 108be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn 109be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn public void addTab(ActionBar.Tab tab, Class<?> clss, Bundle args) { 110be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn TabInfo info = new TabInfo(clss, args); 111be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn tab.setTag(info); 112be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn tab.setTabListener(this); 113be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn mTabs.add(info); 114be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn mActionBar.addTab(tab); 115be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn notifyDataSetChanged(); 116be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn } 117be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn 118be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn @Override 119be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn public int getCount() { 120be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn return mTabs.size(); 121be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn } 122be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn 123be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn @Override 124be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn public Fragment getItem(int position) { 125be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn TabInfo info = mTabs.get(position); 126be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn return Fragment.instantiate(mContext, info.clss.getName(), info.args); 127be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn } 128be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn 129be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn @Override 130be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { 131be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn } 132be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn 133be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn @Override 134be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn public void onPageSelected(int position) { 135be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn mActionBar.setSelectedNavigationItem(position); 136be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn } 137be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn 138be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn @Override 13973742f8b581982a04aa4f7cf9985ef848ef62bebAdam Powell public void onPageScrollStateChanged(int state) { 14073742f8b581982a04aa4f7cf9985ef848ef62bebAdam Powell } 14173742f8b581982a04aa4f7cf9985ef848ef62bebAdam Powell 14273742f8b581982a04aa4f7cf9985ef848ef62bebAdam Powell @Override 143be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn public void onTabSelected(Tab tab, FragmentTransaction ft) { 144be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn Object tag = tab.getTag(); 145be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn for (int i=0; i<mTabs.size(); i++) { 146be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn if (mTabs.get(i) == tag) { 147be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn mViewPager.setCurrentItem(i); 148be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn } 149be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn } 150be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn } 151be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn 152be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn @Override 153be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn public void onTabUnselected(Tab tab, FragmentTransaction ft) { 154be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn } 155be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn 156be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn @Override 157be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn public void onTabReselected(Tab tab, FragmentTransaction ft) { 158be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn } 159be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn } 160be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn} 161e0c8f946e671a97b5c40cb6584ab00afd6f0b548Dianne Hackborn//END_INCLUDE(complete) 162