1/* 2 * Copyright 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 17package com.example.android.effectivenavigation; 18 19import android.app.ActionBar; 20import android.app.FragmentTransaction; 21import android.content.Intent; 22import android.os.Bundle; 23import android.support.v4.app.Fragment; 24import android.support.v4.app.FragmentActivity; 25import android.support.v4.app.FragmentManager; 26import android.support.v4.app.FragmentPagerAdapter; 27import android.support.v4.view.ViewPager; 28import android.view.LayoutInflater; 29import android.view.View; 30import android.view.ViewGroup; 31import android.widget.TextView; 32 33public class MainActivity extends FragmentActivity implements ActionBar.TabListener { 34 35 /** 36 * The {@link android.support.v4.view.PagerAdapter} that will provide fragments for each of the 37 * three primary sections of the app. We use a {@link android.support.v4.app.FragmentPagerAdapter} 38 * derivative, which will keep every loaded fragment in memory. If this becomes too memory 39 * intensive, it may be best to switch to a {@link android.support.v4.app.FragmentStatePagerAdapter}. 40 */ 41 AppSectionsPagerAdapter mAppSectionsPagerAdapter; 42 43 /** 44 * The {@link ViewPager} that will display the three primary sections of the app, one at a 45 * time. 46 */ 47 ViewPager mViewPager; 48 49 public void onCreate(Bundle savedInstanceState) { 50 super.onCreate(savedInstanceState); 51 setContentView(R.layout.activity_main); 52 53 // Create the adapter that will return a fragment for each of the three primary sections 54 // of the app. 55 mAppSectionsPagerAdapter = new AppSectionsPagerAdapter(getSupportFragmentManager()); 56 57 // Set up the action bar. 58 final ActionBar actionBar = getActionBar(); 59 60 // Specify that the Home/Up button should not be enabled, since there is no hierarchical 61 // parent. 62 actionBar.setHomeButtonEnabled(false); 63 64 // Specify that we will be displaying tabs in the action bar. 65 actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); 66 67 // Set up the ViewPager, attaching the adapter and setting up a listener for when the 68 // user swipes between sections. 69 mViewPager = (ViewPager) findViewById(R.id.pager); 70 mViewPager.setAdapter(mAppSectionsPagerAdapter); 71 mViewPager.setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() { 72 @Override 73 public void onPageSelected(int position) { 74 // When swiping between different app sections, select the corresponding tab. 75 // We can also use ActionBar.Tab#select() to do this if we have a reference to the 76 // Tab. 77 actionBar.setSelectedNavigationItem(position); 78 } 79 }); 80 81 // For each of the sections in the app, add a tab to the action bar. 82 for (int i = 0; i < mAppSectionsPagerAdapter.getCount(); i++) { 83 // Create a tab with text corresponding to the page title defined by the adapter. 84 // Also specify this Activity object, which implements the TabListener interface, as the 85 // listener for when this tab is selected. 86 actionBar.addTab( 87 actionBar.newTab() 88 .setText(mAppSectionsPagerAdapter.getPageTitle(i)) 89 .setTabListener(this)); 90 } 91 } 92 93 @Override 94 public void onTabUnselected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction) { 95 } 96 97 @Override 98 public void onTabSelected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction) { 99 // When the given tab is selected, switch to the corresponding page in the ViewPager. 100 mViewPager.setCurrentItem(tab.getPosition()); 101 } 102 103 @Override 104 public void onTabReselected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction) { 105 } 106 107 /** 108 * A {@link FragmentPagerAdapter} that returns a fragment corresponding to one of the primary 109 * sections of the app. 110 */ 111 public static class AppSectionsPagerAdapter extends FragmentPagerAdapter { 112 113 public AppSectionsPagerAdapter(FragmentManager fm) { 114 super(fm); 115 } 116 117 @Override 118 public Fragment getItem(int i) { 119 switch (i) { 120 case 0: 121 // The first section of the app is the most interesting -- it offers 122 // a launchpad into the other demonstrations in this example application. 123 return new LaunchpadSectionFragment(); 124 125 default: 126 // The other sections of the app are dummy placeholders. 127 Fragment fragment = new DummySectionFragment(); 128 Bundle args = new Bundle(); 129 args.putInt(DummySectionFragment.ARG_SECTION_NUMBER, i + 1); 130 fragment.setArguments(args); 131 return fragment; 132 } 133 } 134 135 @Override 136 public int getCount() { 137 return 3; 138 } 139 140 @Override 141 public CharSequence getPageTitle(int position) { 142 return "Section " + (position + 1); 143 } 144 } 145 146 /** 147 * A fragment that launches other parts of the demo application. 148 */ 149 public static class LaunchpadSectionFragment extends Fragment { 150 151 @Override 152 public View onCreateView(LayoutInflater inflater, ViewGroup container, 153 Bundle savedInstanceState) { 154 View rootView = inflater.inflate(R.layout.fragment_section_launchpad, container, false); 155 156 // Demonstration of a collection-browsing activity. 157 rootView.findViewById(R.id.demo_collection_button) 158 .setOnClickListener(new View.OnClickListener() { 159 @Override 160 public void onClick(View view) { 161 Intent intent = new Intent(getActivity(), CollectionDemoActivity.class); 162 startActivity(intent); 163 } 164 }); 165 166 // Demonstration of navigating to external activities. 167 rootView.findViewById(R.id.demo_external_activity) 168 .setOnClickListener(new View.OnClickListener() { 169 @Override 170 public void onClick(View view) { 171 // Create an intent that asks the user to pick a photo, but using 172 // FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET, ensures that relaunching 173 // the application from the device home screen does not return 174 // to the external activity. 175 Intent externalActivityIntent = new Intent(Intent.ACTION_PICK); 176 externalActivityIntent.setType("image/*"); 177 externalActivityIntent.addFlags( 178 Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET); 179 startActivity(externalActivityIntent); 180 } 181 }); 182 183 return rootView; 184 } 185 } 186 187 /** 188 * A dummy fragment representing a section of the app, but that simply displays dummy text. 189 */ 190 public static class DummySectionFragment extends Fragment { 191 192 public static final String ARG_SECTION_NUMBER = "section_number"; 193 194 @Override 195 public View onCreateView(LayoutInflater inflater, ViewGroup container, 196 Bundle savedInstanceState) { 197 View rootView = inflater.inflate(R.layout.fragment_section_dummy, container, false); 198 Bundle args = getArguments(); 199 ((TextView) rootView.findViewById(android.R.id.text1)).setText( 200 getString(R.string.dummy_section_text, args.getInt(ARG_SECTION_NUMBER))); 201 return rootView; 202 } 203 } 204} 205