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