12b658f0d9f59a73722ca7060a0cbb868c4b851acAdam Powell/*
22b658f0d9f59a73722ca7060a0cbb868c4b851acAdam Powell * Copyright (C) 2010 The Android Open Source Project
32b658f0d9f59a73722ca7060a0cbb868c4b851acAdam Powell *
42b658f0d9f59a73722ca7060a0cbb868c4b851acAdam Powell * Licensed under the Apache License, Version 2.0 (the "License");
52b658f0d9f59a73722ca7060a0cbb868c4b851acAdam Powell * you may not use this file except in compliance with the License.
62b658f0d9f59a73722ca7060a0cbb868c4b851acAdam Powell * You may obtain a copy of the License at
72b658f0d9f59a73722ca7060a0cbb868c4b851acAdam Powell *
82b658f0d9f59a73722ca7060a0cbb868c4b851acAdam Powell *      http://www.apache.org/licenses/LICENSE-2.0
92b658f0d9f59a73722ca7060a0cbb868c4b851acAdam Powell *
102b658f0d9f59a73722ca7060a0cbb868c4b851acAdam Powell * Unless required by applicable law or agreed to in writing, software
112b658f0d9f59a73722ca7060a0cbb868c4b851acAdam Powell * distributed under the License is distributed on an "AS IS" BASIS,
122b658f0d9f59a73722ca7060a0cbb868c4b851acAdam Powell * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
132b658f0d9f59a73722ca7060a0cbb868c4b851acAdam Powell * See the License for the specific language governing permissions and
142b658f0d9f59a73722ca7060a0cbb868c4b851acAdam Powell * limitations under the License.
152b658f0d9f59a73722ca7060a0cbb868c4b851acAdam Powell */
162b658f0d9f59a73722ca7060a0cbb868c4b851acAdam Powellpackage com.example.android.apis.app;
172b658f0d9f59a73722ca7060a0cbb868c4b851acAdam Powell
182b658f0d9f59a73722ca7060a0cbb868c4b851acAdam Powellimport com.example.android.apis.R;
192b658f0d9f59a73722ca7060a0cbb868c4b851acAdam Powell
202b658f0d9f59a73722ca7060a0cbb868c4b851acAdam Powellimport android.app.ActionBar;
212b658f0d9f59a73722ca7060a0cbb868c4b851acAdam Powellimport android.app.ActionBar.Tab;
222b658f0d9f59a73722ca7060a0cbb868c4b851acAdam Powellimport android.app.Activity;
232b658f0d9f59a73722ca7060a0cbb868c4b851acAdam Powellimport android.app.Fragment;
242b658f0d9f59a73722ca7060a0cbb868c4b851acAdam Powellimport android.app.FragmentTransaction;
252b658f0d9f59a73722ca7060a0cbb868c4b851acAdam Powellimport android.os.Bundle;
262b658f0d9f59a73722ca7060a0cbb868c4b851acAdam Powellimport android.view.LayoutInflater;
272b658f0d9f59a73722ca7060a0cbb868c4b851acAdam Powellimport android.view.View;
282b658f0d9f59a73722ca7060a0cbb868c4b851acAdam Powellimport android.view.ViewGroup;
292b658f0d9f59a73722ca7060a0cbb868c4b851acAdam Powellimport android.widget.TextView;
302b658f0d9f59a73722ca7060a0cbb868c4b851acAdam Powellimport android.widget.Toast;
312b658f0d9f59a73722ca7060a0cbb868c4b851acAdam Powell
322b658f0d9f59a73722ca7060a0cbb868c4b851acAdam Powell/**
332b658f0d9f59a73722ca7060a0cbb868c4b851acAdam Powell * This demonstrates the use of action bar tabs and how they interact
342b658f0d9f59a73722ca7060a0cbb868c4b851acAdam Powell * with other action bar features.
352b658f0d9f59a73722ca7060a0cbb868c4b851acAdam Powell */
362b658f0d9f59a73722ca7060a0cbb868c4b851acAdam Powellpublic class ActionBarTabs extends Activity {
372b658f0d9f59a73722ca7060a0cbb868c4b851acAdam Powell    @Override
382b658f0d9f59a73722ca7060a0cbb868c4b851acAdam Powell    protected void onCreate(Bundle savedInstanceState) {
392b658f0d9f59a73722ca7060a0cbb868c4b851acAdam Powell        super.onCreate(savedInstanceState);
402b658f0d9f59a73722ca7060a0cbb868c4b851acAdam Powell
412b658f0d9f59a73722ca7060a0cbb868c4b851acAdam Powell        setContentView(R.layout.action_bar_tabs);
422b658f0d9f59a73722ca7060a0cbb868c4b851acAdam Powell    }
432b658f0d9f59a73722ca7060a0cbb868c4b851acAdam Powell
442b658f0d9f59a73722ca7060a0cbb868c4b851acAdam Powell    public void onAddTab(View v) {
452b658f0d9f59a73722ca7060a0cbb868c4b851acAdam Powell        final ActionBar bar = getActionBar();
462b658f0d9f59a73722ca7060a0cbb868c4b851acAdam Powell        final int tabCount = bar.getTabCount();
472b658f0d9f59a73722ca7060a0cbb868c4b851acAdam Powell        final String text = "Tab " + tabCount;
482b658f0d9f59a73722ca7060a0cbb868c4b851acAdam Powell        bar.addTab(bar.newTab()
492b658f0d9f59a73722ca7060a0cbb868c4b851acAdam Powell                .setText(text)
502b658f0d9f59a73722ca7060a0cbb868c4b851acAdam Powell                .setTabListener(new TabListener(new TabContentFragment(text))));
512b658f0d9f59a73722ca7060a0cbb868c4b851acAdam Powell    }
522b658f0d9f59a73722ca7060a0cbb868c4b851acAdam Powell
532b658f0d9f59a73722ca7060a0cbb868c4b851acAdam Powell    public void onRemoveTab(View v) {
542b658f0d9f59a73722ca7060a0cbb868c4b851acAdam Powell        final ActionBar bar = getActionBar();
557ec212f1185e4dd43d765b22d65485d141037ae6Cheng Ke        if (bar.getTabCount() > 0) {
567ec212f1185e4dd43d765b22d65485d141037ae6Cheng Ke            bar.removeTabAt(bar.getTabCount() - 1);
577ec212f1185e4dd43d765b22d65485d141037ae6Cheng Ke        }
582b658f0d9f59a73722ca7060a0cbb868c4b851acAdam Powell    }
592b658f0d9f59a73722ca7060a0cbb868c4b851acAdam Powell
602b658f0d9f59a73722ca7060a0cbb868c4b851acAdam Powell    public void onToggleTabs(View v) {
612b658f0d9f59a73722ca7060a0cbb868c4b851acAdam Powell        final ActionBar bar = getActionBar();
622b658f0d9f59a73722ca7060a0cbb868c4b851acAdam Powell
632b658f0d9f59a73722ca7060a0cbb868c4b851acAdam Powell        if (bar.getNavigationMode() == ActionBar.NAVIGATION_MODE_TABS) {
642b658f0d9f59a73722ca7060a0cbb868c4b851acAdam Powell            bar.setNavigationMode(ActionBar.NAVIGATION_MODE_STANDARD);
652b658f0d9f59a73722ca7060a0cbb868c4b851acAdam Powell            bar.setDisplayOptions(ActionBar.DISPLAY_SHOW_TITLE, ActionBar.DISPLAY_SHOW_TITLE);
662b658f0d9f59a73722ca7060a0cbb868c4b851acAdam Powell        } else {
672b658f0d9f59a73722ca7060a0cbb868c4b851acAdam Powell            bar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
682b658f0d9f59a73722ca7060a0cbb868c4b851acAdam Powell            bar.setDisplayOptions(0, ActionBar.DISPLAY_SHOW_TITLE);
692b658f0d9f59a73722ca7060a0cbb868c4b851acAdam Powell        }
702b658f0d9f59a73722ca7060a0cbb868c4b851acAdam Powell    }
712b658f0d9f59a73722ca7060a0cbb868c4b851acAdam Powell
722b658f0d9f59a73722ca7060a0cbb868c4b851acAdam Powell    public void onRemoveAllTabs(View v) {
732b658f0d9f59a73722ca7060a0cbb868c4b851acAdam Powell        getActionBar().removeAllTabs();
742b658f0d9f59a73722ca7060a0cbb868c4b851acAdam Powell    }
752b658f0d9f59a73722ca7060a0cbb868c4b851acAdam Powell
762b658f0d9f59a73722ca7060a0cbb868c4b851acAdam Powell    /**
772b658f0d9f59a73722ca7060a0cbb868c4b851acAdam Powell     * A TabListener receives event callbacks from the action bar as tabs
782b658f0d9f59a73722ca7060a0cbb868c4b851acAdam Powell     * are deselected, selected, and reselected. A FragmentTransaction
792b658f0d9f59a73722ca7060a0cbb868c4b851acAdam Powell     * is provided to each of these callbacks; if any operations are added
802b658f0d9f59a73722ca7060a0cbb868c4b851acAdam Powell     * to it, it will be committed at the end of the full tab switch operation.
812b658f0d9f59a73722ca7060a0cbb868c4b851acAdam Powell     * This lets tab switches be atomic without the app needing to track
822b658f0d9f59a73722ca7060a0cbb868c4b851acAdam Powell     * the interactions between different tabs.
83be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn     *
84be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn     * NOTE: This is a very simple implementation that does not retain
85be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn     * fragment state of the non-visible tabs across activity instances.
86be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn     * Look at the FragmentTabs example for how to do a more complete
87be6b6b494f094eea0abcd83eb8770bc4b9f7e34eDianne Hackborn     * implementation.
882b658f0d9f59a73722ca7060a0cbb868c4b851acAdam Powell     */
892b658f0d9f59a73722ca7060a0cbb868c4b851acAdam Powell    private class TabListener implements ActionBar.TabListener {
902b658f0d9f59a73722ca7060a0cbb868c4b851acAdam Powell        private TabContentFragment mFragment;
912b658f0d9f59a73722ca7060a0cbb868c4b851acAdam Powell
922b658f0d9f59a73722ca7060a0cbb868c4b851acAdam Powell        public TabListener(TabContentFragment fragment) {
932b658f0d9f59a73722ca7060a0cbb868c4b851acAdam Powell            mFragment = fragment;
942b658f0d9f59a73722ca7060a0cbb868c4b851acAdam Powell        }
952b658f0d9f59a73722ca7060a0cbb868c4b851acAdam Powell
962b658f0d9f59a73722ca7060a0cbb868c4b851acAdam Powell        public void onTabSelected(Tab tab, FragmentTransaction ft) {
972b658f0d9f59a73722ca7060a0cbb868c4b851acAdam Powell            ft.add(R.id.fragment_content, mFragment, mFragment.getText());
982b658f0d9f59a73722ca7060a0cbb868c4b851acAdam Powell        }
992b658f0d9f59a73722ca7060a0cbb868c4b851acAdam Powell
1002b658f0d9f59a73722ca7060a0cbb868c4b851acAdam Powell        public void onTabUnselected(Tab tab, FragmentTransaction ft) {
1012b658f0d9f59a73722ca7060a0cbb868c4b851acAdam Powell            ft.remove(mFragment);
1022b658f0d9f59a73722ca7060a0cbb868c4b851acAdam Powell        }
1032b658f0d9f59a73722ca7060a0cbb868c4b851acAdam Powell
1042b658f0d9f59a73722ca7060a0cbb868c4b851acAdam Powell        public void onTabReselected(Tab tab, FragmentTransaction ft) {
1052b658f0d9f59a73722ca7060a0cbb868c4b851acAdam Powell            Toast.makeText(ActionBarTabs.this, "Reselected!", Toast.LENGTH_SHORT).show();
1062b658f0d9f59a73722ca7060a0cbb868c4b851acAdam Powell        }
1072b658f0d9f59a73722ca7060a0cbb868c4b851acAdam Powell
1082b658f0d9f59a73722ca7060a0cbb868c4b851acAdam Powell    }
1092b658f0d9f59a73722ca7060a0cbb868c4b851acAdam Powell
1102b658f0d9f59a73722ca7060a0cbb868c4b851acAdam Powell    private class TabContentFragment extends Fragment {
1112b658f0d9f59a73722ca7060a0cbb868c4b851acAdam Powell        private String mText;
1122b658f0d9f59a73722ca7060a0cbb868c4b851acAdam Powell
1132b658f0d9f59a73722ca7060a0cbb868c4b851acAdam Powell        public TabContentFragment(String text) {
1142b658f0d9f59a73722ca7060a0cbb868c4b851acAdam Powell            mText = text;
1152b658f0d9f59a73722ca7060a0cbb868c4b851acAdam Powell        }
1162b658f0d9f59a73722ca7060a0cbb868c4b851acAdam Powell
1172b658f0d9f59a73722ca7060a0cbb868c4b851acAdam Powell        public String getText() {
1182b658f0d9f59a73722ca7060a0cbb868c4b851acAdam Powell            return mText;
1192b658f0d9f59a73722ca7060a0cbb868c4b851acAdam Powell        }
1202b658f0d9f59a73722ca7060a0cbb868c4b851acAdam Powell
1212b658f0d9f59a73722ca7060a0cbb868c4b851acAdam Powell        @Override
1222b658f0d9f59a73722ca7060a0cbb868c4b851acAdam Powell        public View onCreateView(LayoutInflater inflater, ViewGroup container,
1232b658f0d9f59a73722ca7060a0cbb868c4b851acAdam Powell                Bundle savedInstanceState) {
1242b658f0d9f59a73722ca7060a0cbb868c4b851acAdam Powell            View fragView = inflater.inflate(R.layout.action_bar_tab_content, container, false);
1252b658f0d9f59a73722ca7060a0cbb868c4b851acAdam Powell
1262b658f0d9f59a73722ca7060a0cbb868c4b851acAdam Powell            TextView text = (TextView) fragView.findViewById(R.id.text);
1272b658f0d9f59a73722ca7060a0cbb868c4b851acAdam Powell            text.setText(mText);
1282b658f0d9f59a73722ca7060a0cbb868c4b851acAdam Powell
1292b658f0d9f59a73722ca7060a0cbb868c4b851acAdam Powell            return fragView;
1302b658f0d9f59a73722ca7060a0cbb868c4b851acAdam Powell        }
1312b658f0d9f59a73722ca7060a0cbb868c4b851acAdam Powell
1322b658f0d9f59a73722ca7060a0cbb868c4b851acAdam Powell    }
1332b658f0d9f59a73722ca7060a0cbb868c4b851acAdam Powell}
134