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