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