1f3f7c5f775167cf4fbd28171abd54b0436664965Dianne Hackborn/* 2f3f7c5f775167cf4fbd28171abd54b0436664965Dianne Hackborn * Copyright (C) 2012 The Android Open Source Project 3f3f7c5f775167cf4fbd28171abd54b0436664965Dianne Hackborn * 4f3f7c5f775167cf4fbd28171abd54b0436664965Dianne Hackborn * Licensed under the Apache License, Version 2.0 (the "License"); 5f3f7c5f775167cf4fbd28171abd54b0436664965Dianne Hackborn * you may not use this file except in compliance with the License. 6f3f7c5f775167cf4fbd28171abd54b0436664965Dianne Hackborn * You may obtain a copy of the License at 7f3f7c5f775167cf4fbd28171abd54b0436664965Dianne Hackborn * 8f3f7c5f775167cf4fbd28171abd54b0436664965Dianne Hackborn * http://www.apache.org/licenses/LICENSE-2.0 9f3f7c5f775167cf4fbd28171abd54b0436664965Dianne Hackborn * 10f3f7c5f775167cf4fbd28171abd54b0436664965Dianne Hackborn * Unless required by applicable law or agreed to in writing, software 11f3f7c5f775167cf4fbd28171abd54b0436664965Dianne Hackborn * distributed under the License is distributed on an "AS IS" BASIS, 12f3f7c5f775167cf4fbd28171abd54b0436664965Dianne Hackborn * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13f3f7c5f775167cf4fbd28171abd54b0436664965Dianne Hackborn * See the License for the specific language governing permissions and 14f3f7c5f775167cf4fbd28171abd54b0436664965Dianne Hackborn * limitations under the License. 15f3f7c5f775167cf4fbd28171abd54b0436664965Dianne Hackborn */ 16f3f7c5f775167cf4fbd28171abd54b0436664965Dianne Hackbornpackage com.example.android.apis.app; 17f3f7c5f775167cf4fbd28171abd54b0436664965Dianne Hackborn 18f3f7c5f775167cf4fbd28171abd54b0436664965Dianne Hackborn//BEGIN_INCLUDE(complete) 19f3f7c5f775167cf4fbd28171abd54b0436664965Dianne Hackbornimport android.app.ActionBar; 20f3f7c5f775167cf4fbd28171abd54b0436664965Dianne Hackbornimport android.app.ActionBar.Tab; 21f3f7c5f775167cf4fbd28171abd54b0436664965Dianne Hackbornimport android.app.Activity; 22f3f7c5f775167cf4fbd28171abd54b0436664965Dianne Hackbornimport android.app.Fragment; 237263dad223864b9be5aa3458dabdc6f0d8db1f0cDianne Hackbornimport android.app.FragmentManager; 24f3f7c5f775167cf4fbd28171abd54b0436664965Dianne Hackbornimport android.app.FragmentTransaction; 25f3f7c5f775167cf4fbd28171abd54b0436664965Dianne Hackbornimport android.os.Bundle; 26f3f7c5f775167cf4fbd28171abd54b0436664965Dianne Hackbornimport android.widget.Toast; 27f3f7c5f775167cf4fbd28171abd54b0436664965Dianne Hackborn 28f3f7c5f775167cf4fbd28171abd54b0436664965Dianne Hackborn/** 29f3f7c5f775167cf4fbd28171abd54b0436664965Dianne Hackborn * This demonstrates the use of action bar tabs and how they interact 30f3f7c5f775167cf4fbd28171abd54b0436664965Dianne Hackborn * with other action bar features. 31f3f7c5f775167cf4fbd28171abd54b0436664965Dianne Hackborn */ 32f3f7c5f775167cf4fbd28171abd54b0436664965Dianne Hackbornpublic class FragmentNestingTabs extends Activity { 33f3f7c5f775167cf4fbd28171abd54b0436664965Dianne Hackborn @Override 34f3f7c5f775167cf4fbd28171abd54b0436664965Dianne Hackborn protected void onCreate(Bundle savedInstanceState) { 357263dad223864b9be5aa3458dabdc6f0d8db1f0cDianne Hackborn FragmentManager.enableDebugLogging(true); 36f3f7c5f775167cf4fbd28171abd54b0436664965Dianne Hackborn super.onCreate(savedInstanceState); 37f3f7c5f775167cf4fbd28171abd54b0436664965Dianne Hackborn 38f3f7c5f775167cf4fbd28171abd54b0436664965Dianne Hackborn final ActionBar bar = getActionBar(); 39f3f7c5f775167cf4fbd28171abd54b0436664965Dianne Hackborn bar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); 40f3f7c5f775167cf4fbd28171abd54b0436664965Dianne Hackborn bar.setDisplayOptions(0, ActionBar.DISPLAY_SHOW_TITLE); 41f3f7c5f775167cf4fbd28171abd54b0436664965Dianne Hackborn 42f3f7c5f775167cf4fbd28171abd54b0436664965Dianne Hackborn bar.addTab(bar.newTab() 43f3f7c5f775167cf4fbd28171abd54b0436664965Dianne Hackborn .setText("Menus") 44f3f7c5f775167cf4fbd28171abd54b0436664965Dianne Hackborn .setTabListener(new TabListener<FragmentMenuFragment>( 45f3f7c5f775167cf4fbd28171abd54b0436664965Dianne Hackborn this, "menus", FragmentMenuFragment.class))); 46f3f7c5f775167cf4fbd28171abd54b0436664965Dianne Hackborn bar.addTab(bar.newTab() 47f3f7c5f775167cf4fbd28171abd54b0436664965Dianne Hackborn .setText("Args") 48f3f7c5f775167cf4fbd28171abd54b0436664965Dianne Hackborn .setTabListener(new TabListener<FragmentArgumentsFragment>( 49f3f7c5f775167cf4fbd28171abd54b0436664965Dianne Hackborn this, "args", FragmentArgumentsFragment.class))); 50f3f7c5f775167cf4fbd28171abd54b0436664965Dianne Hackborn bar.addTab(bar.newTab() 51f3f7c5f775167cf4fbd28171abd54b0436664965Dianne Hackborn .setText("Stack") 52f3f7c5f775167cf4fbd28171abd54b0436664965Dianne Hackborn .setTabListener(new TabListener<FragmentStackFragment>( 53f3f7c5f775167cf4fbd28171abd54b0436664965Dianne Hackborn this, "stack", FragmentStackFragment.class))); 54f3f7c5f775167cf4fbd28171abd54b0436664965Dianne Hackborn bar.addTab(bar.newTab() 55f3f7c5f775167cf4fbd28171abd54b0436664965Dianne Hackborn .setText("Tabs") 56f3f7c5f775167cf4fbd28171abd54b0436664965Dianne Hackborn .setTabListener(new TabListener<FragmentTabsFragment>( 57f3f7c5f775167cf4fbd28171abd54b0436664965Dianne Hackborn this, "tabs", FragmentTabsFragment.class))); 58f3f7c5f775167cf4fbd28171abd54b0436664965Dianne Hackborn 59f3f7c5f775167cf4fbd28171abd54b0436664965Dianne Hackborn if (savedInstanceState != null) { 60f3f7c5f775167cf4fbd28171abd54b0436664965Dianne Hackborn bar.setSelectedNavigationItem(savedInstanceState.getInt("tab", 0)); 61f3f7c5f775167cf4fbd28171abd54b0436664965Dianne Hackborn } 62f3f7c5f775167cf4fbd28171abd54b0436664965Dianne Hackborn } 63f3f7c5f775167cf4fbd28171abd54b0436664965Dianne Hackborn 64f3f7c5f775167cf4fbd28171abd54b0436664965Dianne Hackborn @Override 65f3f7c5f775167cf4fbd28171abd54b0436664965Dianne Hackborn protected void onSaveInstanceState(Bundle outState) { 66f3f7c5f775167cf4fbd28171abd54b0436664965Dianne Hackborn super.onSaveInstanceState(outState); 67f3f7c5f775167cf4fbd28171abd54b0436664965Dianne Hackborn outState.putInt("tab", getActionBar().getSelectedNavigationIndex()); 68f3f7c5f775167cf4fbd28171abd54b0436664965Dianne Hackborn } 69f3f7c5f775167cf4fbd28171abd54b0436664965Dianne Hackborn 70f3f7c5f775167cf4fbd28171abd54b0436664965Dianne Hackborn public static class TabListener<T extends Fragment> implements ActionBar.TabListener { 71f3f7c5f775167cf4fbd28171abd54b0436664965Dianne Hackborn private final Activity mActivity; 72f3f7c5f775167cf4fbd28171abd54b0436664965Dianne Hackborn private final String mTag; 73f3f7c5f775167cf4fbd28171abd54b0436664965Dianne Hackborn private final Class<T> mClass; 74f3f7c5f775167cf4fbd28171abd54b0436664965Dianne Hackborn private final Bundle mArgs; 75f3f7c5f775167cf4fbd28171abd54b0436664965Dianne Hackborn private Fragment mFragment; 76f3f7c5f775167cf4fbd28171abd54b0436664965Dianne Hackborn 77f3f7c5f775167cf4fbd28171abd54b0436664965Dianne Hackborn public TabListener(Activity activity, String tag, Class<T> clz) { 78f3f7c5f775167cf4fbd28171abd54b0436664965Dianne Hackborn this(activity, tag, clz, null); 79f3f7c5f775167cf4fbd28171abd54b0436664965Dianne Hackborn } 80f3f7c5f775167cf4fbd28171abd54b0436664965Dianne Hackborn 81f3f7c5f775167cf4fbd28171abd54b0436664965Dianne Hackborn public TabListener(Activity activity, String tag, Class<T> clz, Bundle args) { 82f3f7c5f775167cf4fbd28171abd54b0436664965Dianne Hackborn mActivity = activity; 83f3f7c5f775167cf4fbd28171abd54b0436664965Dianne Hackborn mTag = tag; 84f3f7c5f775167cf4fbd28171abd54b0436664965Dianne Hackborn mClass = clz; 85f3f7c5f775167cf4fbd28171abd54b0436664965Dianne Hackborn mArgs = args; 86f3f7c5f775167cf4fbd28171abd54b0436664965Dianne Hackborn 87f3f7c5f775167cf4fbd28171abd54b0436664965Dianne Hackborn // Check to see if we already have a fragment for this tab, probably 88f3f7c5f775167cf4fbd28171abd54b0436664965Dianne Hackborn // from a previously saved state. If so, deactivate it, because our 89f3f7c5f775167cf4fbd28171abd54b0436664965Dianne Hackborn // initial state is that a tab isn't shown. 90f3f7c5f775167cf4fbd28171abd54b0436664965Dianne Hackborn mFragment = mActivity.getFragmentManager().findFragmentByTag(mTag); 91f3f7c5f775167cf4fbd28171abd54b0436664965Dianne Hackborn if (mFragment != null && !mFragment.isDetached()) { 92f3f7c5f775167cf4fbd28171abd54b0436664965Dianne Hackborn FragmentTransaction ft = mActivity.getFragmentManager().beginTransaction(); 93f3f7c5f775167cf4fbd28171abd54b0436664965Dianne Hackborn ft.detach(mFragment); 94f3f7c5f775167cf4fbd28171abd54b0436664965Dianne Hackborn ft.commit(); 95f3f7c5f775167cf4fbd28171abd54b0436664965Dianne Hackborn } 96f3f7c5f775167cf4fbd28171abd54b0436664965Dianne Hackborn } 97f3f7c5f775167cf4fbd28171abd54b0436664965Dianne Hackborn 98f3f7c5f775167cf4fbd28171abd54b0436664965Dianne Hackborn public void onTabSelected(Tab tab, FragmentTransaction ft) { 99f3f7c5f775167cf4fbd28171abd54b0436664965Dianne Hackborn if (mFragment == null) { 100f3f7c5f775167cf4fbd28171abd54b0436664965Dianne Hackborn mFragment = Fragment.instantiate(mActivity, mClass.getName(), mArgs); 101f3f7c5f775167cf4fbd28171abd54b0436664965Dianne Hackborn ft.add(android.R.id.content, mFragment, mTag); 102f3f7c5f775167cf4fbd28171abd54b0436664965Dianne Hackborn } else { 103f3f7c5f775167cf4fbd28171abd54b0436664965Dianne Hackborn ft.attach(mFragment); 104f3f7c5f775167cf4fbd28171abd54b0436664965Dianne Hackborn } 105f3f7c5f775167cf4fbd28171abd54b0436664965Dianne Hackborn } 106f3f7c5f775167cf4fbd28171abd54b0436664965Dianne Hackborn 107f3f7c5f775167cf4fbd28171abd54b0436664965Dianne Hackborn public void onTabUnselected(Tab tab, FragmentTransaction ft) { 108f3f7c5f775167cf4fbd28171abd54b0436664965Dianne Hackborn if (mFragment != null) { 109f3f7c5f775167cf4fbd28171abd54b0436664965Dianne Hackborn ft.detach(mFragment); 110f3f7c5f775167cf4fbd28171abd54b0436664965Dianne Hackborn } 111f3f7c5f775167cf4fbd28171abd54b0436664965Dianne Hackborn } 112f3f7c5f775167cf4fbd28171abd54b0436664965Dianne Hackborn 113f3f7c5f775167cf4fbd28171abd54b0436664965Dianne Hackborn public void onTabReselected(Tab tab, FragmentTransaction ft) { 114f3f7c5f775167cf4fbd28171abd54b0436664965Dianne Hackborn Toast.makeText(mActivity, "Reselected!", Toast.LENGTH_SHORT).show(); 115f3f7c5f775167cf4fbd28171abd54b0436664965Dianne Hackborn } 116f3f7c5f775167cf4fbd28171abd54b0436664965Dianne Hackborn } 117f3f7c5f775167cf4fbd28171abd54b0436664965Dianne Hackborn} 118f3f7c5f775167cf4fbd28171abd54b0436664965Dianne Hackborn//END_INCLUDE(complete) 119