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.apis.app; 17be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn 18be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackbornimport com.example.android.apis.R; 19be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn 20102041a8bc4ebca69c20f5d281a96a904c52d4c8Dianne Hackborn//BEGIN_INCLUDE(complete) 21be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackbornimport android.app.ActionBar; 22be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackbornimport android.app.ActionBar.Tab; 23be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackbornimport android.app.Activity; 24be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackbornimport android.app.Fragment; 25be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackbornimport android.app.FragmentTransaction; 26be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackbornimport android.os.Bundle; 27be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackbornimport android.widget.Toast; 28be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn 29be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn/** 30be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn * This demonstrates the use of action bar tabs and how they interact 31be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn * with other action bar features. 32be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn */ 33be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackbornpublic class FragmentTabs extends Activity { 34be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn @Override 35be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn protected void onCreate(Bundle savedInstanceState) { 36be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn super.onCreate(savedInstanceState); 37be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn 38be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn final ActionBar bar = getActionBar(); 39be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn bar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); 40be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn bar.setDisplayOptions(0, ActionBar.DISPLAY_SHOW_TITLE); 41be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn 42be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn bar.addTab(bar.newTab() 43be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn .setText("Simple") 44be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn .setTabListener(new TabListener<FragmentStack.CountingFragment>( 45be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn this, "simple", FragmentStack.CountingFragment.class))); 46be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn bar.addTab(bar.newTab() 47be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn .setText("Contacts") 48be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn .setTabListener(new TabListener<LoaderCursor.CursorLoaderListFragment>( 49be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn this, "contacts", LoaderCursor.CursorLoaderListFragment.class))); 50be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn bar.addTab(bar.newTab() 51be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn .setText("Apps") 52be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn .setTabListener(new TabListener<LoaderCustom.AppListFragment>( 53be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn this, "apps", LoaderCustom.AppListFragment.class))); 54be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn bar.addTab(bar.newTab() 55be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn .setText("Throttle") 56be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn .setTabListener(new TabListener<LoaderThrottle.ThrottledLoaderListFragment>( 57be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn this, "throttle", LoaderThrottle.ThrottledLoaderListFragment.class))); 58be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn 59be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn if (savedInstanceState != null) { 60be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn bar.setSelectedNavigationItem(savedInstanceState.getInt("tab", 0)); 61be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn } 62be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn } 63be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn 64be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn @Override 65be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn protected void onSaveInstanceState(Bundle outState) { 66be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn super.onSaveInstanceState(outState); 67be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn outState.putInt("tab", getActionBar().getSelectedNavigationIndex()); 68be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn } 69be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn 70be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn public static class TabListener<T extends Fragment> implements ActionBar.TabListener { 71be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn private final Activity mActivity; 72be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn private final String mTag; 73be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn private final Class<T> mClass; 74be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn private final Bundle mArgs; 75be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn private Fragment mFragment; 76be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn 77be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn public TabListener(Activity activity, String tag, Class<T> clz) { 78be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn this(activity, tag, clz, null); 79be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn } 80be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn 81be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn public TabListener(Activity activity, String tag, Class<T> clz, Bundle args) { 82be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn mActivity = activity; 83be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn mTag = tag; 84be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn mClass = clz; 85be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn mArgs = args; 86be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn 87be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn // Check to see if we already have a fragment for this tab, probably 88be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn // from a previously saved state. If so, deactivate it, because our 89be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn // initial state is that a tab isn't shown. 90be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn mFragment = mActivity.getFragmentManager().findFragmentByTag(mTag); 91be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn if (mFragment != null && !mFragment.isDetached()) { 92be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn FragmentTransaction ft = mActivity.getFragmentManager().beginTransaction(); 93be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn ft.detach(mFragment); 94be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn ft.commit(); 95be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn } 96be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn } 97be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn 98be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn public void onTabSelected(Tab tab, FragmentTransaction ft) { 99be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn if (mFragment == null) { 100be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn mFragment = Fragment.instantiate(mActivity, mClass.getName(), mArgs); 101be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn ft.add(android.R.id.content, mFragment, mTag); 102be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn } else { 103be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn ft.attach(mFragment); 104be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn } 105be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn } 106be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn 107be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn public void onTabUnselected(Tab tab, FragmentTransaction ft) { 108be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn if (mFragment != null) { 109be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn ft.detach(mFragment); 110be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn } 111be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn } 112be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn 113be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn public void onTabReselected(Tab tab, FragmentTransaction ft) { 114be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn Toast.makeText(mActivity, "Reselected!", Toast.LENGTH_SHORT).show(); 115be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn } 116be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn } 117be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn} 118102041a8bc4ebca69c20f5d281a96a904c52d4c8Dianne Hackborn//END_INCLUDE(complete) 119