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.supportv13.app;
17be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn
18be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackbornimport java.util.ArrayList;
19be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn
20be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackbornimport com.example.android.supportv13.R;
21be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn
22be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackbornimport android.app.ActionBar;
23be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackbornimport android.app.ActionBar.Tab;
24be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackbornimport android.app.Activity;
25be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackbornimport android.app.Fragment;
26be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackbornimport android.app.FragmentTransaction;
27be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackbornimport android.content.Context;
28be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackbornimport android.os.Bundle;
29be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackbornimport android.support.v13.app.FragmentPagerAdapter;
30be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackbornimport android.support.v4.view.ViewPager;
31be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn
32be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn/**
33be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn * This demonstrates the use of action bar tabs and how they interact
34be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn * with other action bar features.
35be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn */
36e0c8f946e671a97b5c40cb6584ab00afd6f0b548Dianne Hackborn//BEGIN_INCLUDE(complete)
37be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackbornpublic class ActionBarTabsPager extends Activity {
38be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn    ViewPager mViewPager;
39be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn    TabsAdapter mTabsAdapter;
40be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn
41be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn    @Override
42be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn    protected void onCreate(Bundle savedInstanceState) {
43be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn        super.onCreate(savedInstanceState);
44be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn
45be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn        mViewPager = new ViewPager(this);
46be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn        mViewPager.setId(R.id.pager);
47be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn        setContentView(mViewPager);
48be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn
49be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn        final ActionBar bar = getActionBar();
50be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn        bar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
51be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn        bar.setDisplayOptions(0, ActionBar.DISPLAY_SHOW_TITLE);
52be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn
53be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn        mTabsAdapter = new TabsAdapter(this, mViewPager);
54be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn        mTabsAdapter.addTab(bar.newTab().setText("Simple"),
55be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn                CountingFragment.class, null);
56be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn        mTabsAdapter.addTab(bar.newTab().setText("List"),
57be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn                FragmentPagerSupport.ArrayListFragment.class, null);
58be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn        mTabsAdapter.addTab(bar.newTab().setText("Cursor"),
59be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn                CursorFragment.class, null);
60be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn
61be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn        if (savedInstanceState != null) {
62be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn            bar.setSelectedNavigationItem(savedInstanceState.getInt("tab", 0));
63be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn        }
64be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn    }
65be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn
66be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn    @Override
67be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn    protected void onSaveInstanceState(Bundle outState) {
68be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn        super.onSaveInstanceState(outState);
69be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn        outState.putInt("tab", getActionBar().getSelectedNavigationIndex());
70be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn    }
71be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn
72be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn    /**
73be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn     * This is a helper class that implements the management of tabs and all
74be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn     * details of connecting a ViewPager with associated TabHost.  It relies on a
75be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn     * trick.  Normally a tab host has a simple API for supplying a View or
76be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn     * Intent that each tab will show.  This is not sufficient for switching
77be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn     * between pages.  So instead we make the content part of the tab host
78be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn     * 0dp high (it is not shown) and the TabsAdapter supplies its own dummy
79be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn     * view to show as the tab content.  It listens to changes in tabs, and takes
80be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn     * care of switch to the correct paged in the ViewPager whenever the selected
81be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn     * tab changes.
82be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn     */
83be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn    public static class TabsAdapter extends FragmentPagerAdapter
84be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn            implements ActionBar.TabListener, ViewPager.OnPageChangeListener {
85be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn        private final Context mContext;
86be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn        private final ActionBar mActionBar;
87be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn        private final ViewPager mViewPager;
88be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn        private final ArrayList<TabInfo> mTabs = new ArrayList<TabInfo>();
89be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn
90be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn        static final class TabInfo {
91be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn            private final Class<?> clss;
92be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn            private final Bundle args;
93be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn
94be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn            TabInfo(Class<?> _class, Bundle _args) {
95be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn                clss = _class;
96be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn                args = _args;
97be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn            }
98be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn        }
99be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn
100be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn        public TabsAdapter(Activity activity, ViewPager pager) {
101be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn            super(activity.getFragmentManager());
102be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn            mContext = activity;
103be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn            mActionBar = activity.getActionBar();
104be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn            mViewPager = pager;
105be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn            mViewPager.setAdapter(this);
106be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn            mViewPager.setOnPageChangeListener(this);
107be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn        }
108be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn
109be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn        public void addTab(ActionBar.Tab tab, Class<?> clss, Bundle args) {
110be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn            TabInfo info = new TabInfo(clss, args);
111be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn            tab.setTag(info);
112be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn            tab.setTabListener(this);
113be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn            mTabs.add(info);
114be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn            mActionBar.addTab(tab);
115be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn            notifyDataSetChanged();
116be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn        }
117be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn
118be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn        @Override
119be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn        public int getCount() {
120be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn            return mTabs.size();
121be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn        }
122be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn
123be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn        @Override
124be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn        public Fragment getItem(int position) {
125be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn            TabInfo info = mTabs.get(position);
126be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn            return Fragment.instantiate(mContext, info.clss.getName(), info.args);
127be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn        }
128be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn
129be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn        @Override
130be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn        public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
131be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn        }
132be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn
133be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn        @Override
134be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn        public void onPageSelected(int position) {
135be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn            mActionBar.setSelectedNavigationItem(position);
136be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn        }
137be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn
138be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn        @Override
13973742f8b581982a04aa4f7cf9985ef848ef62bebAdam Powell        public void onPageScrollStateChanged(int state) {
14073742f8b581982a04aa4f7cf9985ef848ef62bebAdam Powell        }
14173742f8b581982a04aa4f7cf9985ef848ef62bebAdam Powell
14273742f8b581982a04aa4f7cf9985ef848ef62bebAdam Powell        @Override
143be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn        public void onTabSelected(Tab tab, FragmentTransaction ft) {
144be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn            Object tag = tab.getTag();
145be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn            for (int i=0; i<mTabs.size(); i++) {
146be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn                if (mTabs.get(i) == tag) {
147be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn                    mViewPager.setCurrentItem(i);
148be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn                }
149be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn            }
150be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn        }
151be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn
152be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn        @Override
153be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn        public void onTabUnselected(Tab tab, FragmentTransaction ft) {
154be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn        }
155be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn
156be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn        @Override
157be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn        public void onTabReselected(Tab tab, FragmentTransaction ft) {
158be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn        }
159be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn    }
160be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn}
161e0c8f946e671a97b5c40cb6584ab00afd6f0b548Dianne Hackborn//END_INCLUDE(complete)
162