Home | History | Annotate | Download | only in app
      1 /*
      2  * Copyright (C) 2012 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 package com.example.android.apis.app;
     17 
     18 //BEGIN_INCLUDE(complete)
     19 import android.app.ActionBar;
     20 import android.app.ActionBar.Tab;
     21 import android.app.Activity;
     22 import android.app.Fragment;
     23 import android.app.FragmentManager;
     24 import android.app.FragmentTransaction;
     25 import android.os.Bundle;
     26 import android.widget.Toast;
     27 
     28 /**
     29  * This demonstrates the use of action bar tabs and how they interact
     30  * with other action bar features.
     31  */
     32 public class FragmentNestingTabs extends Activity {
     33     @Override
     34     protected void onCreate(Bundle savedInstanceState) {
     35         FragmentManager.enableDebugLogging(true);
     36         super.onCreate(savedInstanceState);
     37 
     38         final ActionBar bar = getActionBar();
     39         bar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
     40         bar.setDisplayOptions(0, ActionBar.DISPLAY_SHOW_TITLE);
     41 
     42         bar.addTab(bar.newTab()
     43                 .setText("Menus")
     44                 .setTabListener(new TabListener<FragmentMenuFragment>(
     45                         this, "menus", FragmentMenuFragment.class)));
     46         bar.addTab(bar.newTab()
     47                 .setText("Args")
     48                 .setTabListener(new TabListener<FragmentArgumentsFragment>(
     49                         this, "args", FragmentArgumentsFragment.class)));
     50         bar.addTab(bar.newTab()
     51                 .setText("Stack")
     52                 .setTabListener(new TabListener<FragmentStackFragment>(
     53                         this, "stack", FragmentStackFragment.class)));
     54         bar.addTab(bar.newTab()
     55                 .setText("Tabs")
     56                 .setTabListener(new TabListener<FragmentTabsFragment>(
     57                         this, "tabs", FragmentTabsFragment.class)));
     58 
     59         if (savedInstanceState != null) {
     60             bar.setSelectedNavigationItem(savedInstanceState.getInt("tab", 0));
     61         }
     62     }
     63 
     64     @Override
     65     protected void onSaveInstanceState(Bundle outState) {
     66         super.onSaveInstanceState(outState);
     67         outState.putInt("tab", getActionBar().getSelectedNavigationIndex());
     68     }
     69 
     70     public static class TabListener<T extends Fragment> implements ActionBar.TabListener {
     71         private final Activity mActivity;
     72         private final String mTag;
     73         private final Class<T> mClass;
     74         private final Bundle mArgs;
     75         private Fragment mFragment;
     76 
     77         public TabListener(Activity activity, String tag, Class<T> clz) {
     78             this(activity, tag, clz, null);
     79         }
     80 
     81         public TabListener(Activity activity, String tag, Class<T> clz, Bundle args) {
     82             mActivity = activity;
     83             mTag = tag;
     84             mClass = clz;
     85             mArgs = args;
     86 
     87             // Check to see if we already have a fragment for this tab, probably
     88             // from a previously saved state.  If so, deactivate it, because our
     89             // initial state is that a tab isn't shown.
     90             mFragment = mActivity.getFragmentManager().findFragmentByTag(mTag);
     91             if (mFragment != null && !mFragment.isDetached()) {
     92                 FragmentTransaction ft = mActivity.getFragmentManager().beginTransaction();
     93                 ft.detach(mFragment);
     94                 ft.commit();
     95             }
     96         }
     97 
     98         public void onTabSelected(Tab tab, FragmentTransaction ft) {
     99             if (mFragment == null) {
    100                 mFragment = Fragment.instantiate(mActivity, mClass.getName(), mArgs);
    101                 ft.add(android.R.id.content, mFragment, mTag);
    102             } else {
    103                 ft.attach(mFragment);
    104             }
    105         }
    106 
    107         public void onTabUnselected(Tab tab, FragmentTransaction ft) {
    108             if (mFragment != null) {
    109                 ft.detach(mFragment);
    110             }
    111         }
    112 
    113         public void onTabReselected(Tab tab, FragmentTransaction ft) {
    114             Toast.makeText(mActivity, "Reselected!", Toast.LENGTH_SHORT).show();
    115         }
    116     }
    117 }
    118 //END_INCLUDE(complete)
    119