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