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