1aca7a2311d5d99fb7fbc72ca2d83b412535a554cChris Banes/* 2aca7a2311d5d99fb7fbc72ca2d83b412535a554cChris Banes * Copyright (C) 2015 The Android Open Source Project 3aca7a2311d5d99fb7fbc72ca2d83b412535a554cChris Banes * 4aca7a2311d5d99fb7fbc72ca2d83b412535a554cChris Banes * Licensed under the Apache License, Version 2.0 (the "License"); 5aca7a2311d5d99fb7fbc72ca2d83b412535a554cChris Banes * you may not use this file except in compliance with the License. 6aca7a2311d5d99fb7fbc72ca2d83b412535a554cChris Banes * You may obtain a copy of the License at 7aca7a2311d5d99fb7fbc72ca2d83b412535a554cChris Banes * 8aca7a2311d5d99fb7fbc72ca2d83b412535a554cChris Banes * http://www.apache.org/licenses/LICENSE-2.0 9aca7a2311d5d99fb7fbc72ca2d83b412535a554cChris Banes * 10aca7a2311d5d99fb7fbc72ca2d83b412535a554cChris Banes * Unless required by applicable law or agreed to in writing, software 11aca7a2311d5d99fb7fbc72ca2d83b412535a554cChris Banes * distributed under the License is distributed on an "AS IS" BASIS, 12aca7a2311d5d99fb7fbc72ca2d83b412535a554cChris Banes * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13aca7a2311d5d99fb7fbc72ca2d83b412535a554cChris Banes * See the License for the specific language governing permissions and 14aca7a2311d5d99fb7fbc72ca2d83b412535a554cChris Banes * limitations under the License. 15aca7a2311d5d99fb7fbc72ca2d83b412535a554cChris Banes */ 16aca7a2311d5d99fb7fbc72ca2d83b412535a554cChris Banes 17aca7a2311d5d99fb7fbc72ca2d83b412535a554cChris Banespackage com.example.android.support.design.widget; 18aca7a2311d5d99fb7fbc72ca2d83b412535a554cChris Banes 19aca7a2311d5d99fb7fbc72ca2d83b412535a554cChris Banesimport android.os.Bundle; 20aca7a2311d5d99fb7fbc72ca2d83b412535a554cChris Banesimport android.view.Gravity; 21aca7a2311d5d99fb7fbc72ca2d83b412535a554cChris Banesimport android.view.View; 22aca7a2311d5d99fb7fbc72ca2d83b412535a554cChris Banesimport android.view.ViewGroup; 23aca7a2311d5d99fb7fbc72ca2d83b412535a554cChris Banesimport android.widget.RadioButton; 24aca7a2311d5d99fb7fbc72ca2d83b412535a554cChris Banesimport android.widget.RadioGroup; 25aca7a2311d5d99fb7fbc72ca2d83b412535a554cChris Banesimport android.widget.TextView; 26aca7a2311d5d99fb7fbc72ca2d83b412535a554cChris Banes 27def582a5836579a3fadabfdbe4413cb1652bf098Aurimas Liutikasimport androidx.appcompat.app.AppCompatActivity; 28def582a5836579a3fadabfdbe4413cb1652bf098Aurimas Liutikasimport androidx.appcompat.widget.Toolbar; 29def582a5836579a3fadabfdbe4413cb1652bf098Aurimas Liutikasimport androidx.core.widget.TextViewCompat; 30def582a5836579a3fadabfdbe4413cb1652bf098Aurimas Liutikasimport androidx.viewpager.widget.PagerAdapter; 31def582a5836579a3fadabfdbe4413cb1652bf098Aurimas Liutikasimport androidx.viewpager.widget.ViewPager; 32def582a5836579a3fadabfdbe4413cb1652bf098Aurimas Liutikas 33def582a5836579a3fadabfdbe4413cb1652bf098Aurimas Liutikasimport com.example.android.support.design.Cheeses; 34def582a5836579a3fadabfdbe4413cb1652bf098Aurimas Liutikasimport com.example.android.support.design.R; 35f87e4dfc7bcd2583e7908ca3cda65cec6c697080Aurimas Liutikasimport com.google.android.material.tabs.TabLayout; 36def582a5836579a3fadabfdbe4413cb1652bf098Aurimas Liutikas 37aca7a2311d5d99fb7fbc72ca2d83b412535a554cChris Banesimport java.util.ArrayList; 38aca7a2311d5d99fb7fbc72ca2d83b412535a554cChris Banesimport java.util.Random; 39aca7a2311d5d99fb7fbc72ca2d83b412535a554cChris Banes 40aca7a2311d5d99fb7fbc72ca2d83b412535a554cChris Banes/** 41aca7a2311d5d99fb7fbc72ca2d83b412535a554cChris Banes * This demonstrates idiomatic usage of TabLayout with a ViewPager 42aca7a2311d5d99fb7fbc72ca2d83b412535a554cChris Banes */ 43aca7a2311d5d99fb7fbc72ca2d83b412535a554cChris Banespublic class TabLayoutUsage extends AppCompatActivity { 44aca7a2311d5d99fb7fbc72ca2d83b412535a554cChris Banes 45aca7a2311d5d99fb7fbc72ca2d83b412535a554cChris Banes private TabLayout mTabLayout; 46aca7a2311d5d99fb7fbc72ca2d83b412535a554cChris Banes private ViewPager mViewPager; 47aca7a2311d5d99fb7fbc72ca2d83b412535a554cChris Banes private CheesePagerAdapter mPagerAdapter; 48aca7a2311d5d99fb7fbc72ca2d83b412535a554cChris Banes 49cc3292f20d59b18909fd3c1bfbf03da3e6babb7cChris Banes private final Random mRandom = new Random(); 50cc3292f20d59b18909fd3c1bfbf03da3e6babb7cChris Banes 51aca7a2311d5d99fb7fbc72ca2d83b412535a554cChris Banes @Override 52aca7a2311d5d99fb7fbc72ca2d83b412535a554cChris Banes protected void onCreate(Bundle savedInstanceState) { 53aca7a2311d5d99fb7fbc72ca2d83b412535a554cChris Banes super.onCreate(savedInstanceState); 54aca7a2311d5d99fb7fbc72ca2d83b412535a554cChris Banes setContentView(R.layout.design_tabs_viewpager); 55aca7a2311d5d99fb7fbc72ca2d83b412535a554cChris Banes 56aca7a2311d5d99fb7fbc72ca2d83b412535a554cChris Banes // Retrieve the Toolbar from our content view, and set it as the action bar 57fa2e2acf79d791a90410025daad438968550d18cAlan Viverette Toolbar toolbar = findViewById(R.id.toolbar); 58aca7a2311d5d99fb7fbc72ca2d83b412535a554cChris Banes setSupportActionBar(toolbar); 59aca7a2311d5d99fb7fbc72ca2d83b412535a554cChris Banes getSupportActionBar().setDisplayHomeAsUpEnabled(true); 60aca7a2311d5d99fb7fbc72ca2d83b412535a554cChris Banes 61fa2e2acf79d791a90410025daad438968550d18cAlan Viverette mTabLayout = findViewById(R.id.tabs); 62fa2e2acf79d791a90410025daad438968550d18cAlan Viverette mViewPager = findViewById(R.id.tabs_viewpager); 63cc3292f20d59b18909fd3c1bfbf03da3e6babb7cChris Banes 64aca7a2311d5d99fb7fbc72ca2d83b412535a554cChris Banes mPagerAdapter = new CheesePagerAdapter(); 65aca7a2311d5d99fb7fbc72ca2d83b412535a554cChris Banes mViewPager.setAdapter(mPagerAdapter); 66aca7a2311d5d99fb7fbc72ca2d83b412535a554cChris Banes 67cc3292f20d59b18909fd3c1bfbf03da3e6babb7cChris Banes mTabLayout.setupWithViewPager(mViewPager); 68cc3292f20d59b18909fd3c1bfbf03da3e6babb7cChris Banes 69aca7a2311d5d99fb7fbc72ca2d83b412535a554cChris Banes setupRadioGroup(); 70aca7a2311d5d99fb7fbc72ca2d83b412535a554cChris Banes } 71aca7a2311d5d99fb7fbc72ca2d83b412535a554cChris Banes 72cc3292f20d59b18909fd3c1bfbf03da3e6babb7cChris Banes public void addTab(View view) { 73cc3292f20d59b18909fd3c1bfbf03da3e6babb7cChris Banes String cheese = Cheeses.sCheeseStrings[mRandom.nextInt(Cheeses.sCheeseStrings.length)]; 74cc3292f20d59b18909fd3c1bfbf03da3e6babb7cChris Banes mPagerAdapter.addTab(cheese); 75cc3292f20d59b18909fd3c1bfbf03da3e6babb7cChris Banes } 76dcb9b985623c0aabd135485ea864699a52d3eac6Kirill Grouchnikov 77cc3292f20d59b18909fd3c1bfbf03da3e6babb7cChris Banes public void selectFirstTab(View view) { 78cc3292f20d59b18909fd3c1bfbf03da3e6babb7cChris Banes if (mTabLayout.getTabCount() > 0) { 79cc3292f20d59b18909fd3c1bfbf03da3e6babb7cChris Banes mViewPager.setCurrentItem(0); 80cc3292f20d59b18909fd3c1bfbf03da3e6babb7cChris Banes } 81aca7a2311d5d99fb7fbc72ca2d83b412535a554cChris Banes } 82aca7a2311d5d99fb7fbc72ca2d83b412535a554cChris Banes 83cc3292f20d59b18909fd3c1bfbf03da3e6babb7cChris Banes public void removeTab(View view) { 84cc3292f20d59b18909fd3c1bfbf03da3e6babb7cChris Banes mPagerAdapter.removeTab(); 85aca7a2311d5d99fb7fbc72ca2d83b412535a554cChris Banes } 86aca7a2311d5d99fb7fbc72ca2d83b412535a554cChris Banes 87aca7a2311d5d99fb7fbc72ca2d83b412535a554cChris Banes private void setupRadioGroup() { 88aca7a2311d5d99fb7fbc72ca2d83b412535a554cChris Banes // Setup the initially checked item 89aca7a2311d5d99fb7fbc72ca2d83b412535a554cChris Banes switch (mTabLayout.getTabMode()) { 90aca7a2311d5d99fb7fbc72ca2d83b412535a554cChris Banes case TabLayout.MODE_SCROLLABLE: 91aca7a2311d5d99fb7fbc72ca2d83b412535a554cChris Banes ((RadioButton) findViewById(R.id.rb_tab_scrollable)).setChecked(true); 92aca7a2311d5d99fb7fbc72ca2d83b412535a554cChris Banes break; 93aca7a2311d5d99fb7fbc72ca2d83b412535a554cChris Banes case TabLayout.MODE_FIXED: 94aca7a2311d5d99fb7fbc72ca2d83b412535a554cChris Banes ((RadioButton) findViewById(R.id.rb_tab_fixed)).setChecked(true); 95aca7a2311d5d99fb7fbc72ca2d83b412535a554cChris Banes break; 96aca7a2311d5d99fb7fbc72ca2d83b412535a554cChris Banes } 97aca7a2311d5d99fb7fbc72ca2d83b412535a554cChris Banes 98fa2e2acf79d791a90410025daad438968550d18cAlan Viverette RadioGroup rg = findViewById(R.id.radiogroup_tab_mode); 99aca7a2311d5d99fb7fbc72ca2d83b412535a554cChris Banes rg.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() { 100aca7a2311d5d99fb7fbc72ca2d83b412535a554cChris Banes @Override 101aca7a2311d5d99fb7fbc72ca2d83b412535a554cChris Banes public void onCheckedChanged(RadioGroup radioGroup, int id) { 102aca7a2311d5d99fb7fbc72ca2d83b412535a554cChris Banes switch (id) { 103aca7a2311d5d99fb7fbc72ca2d83b412535a554cChris Banes case R.id.rb_tab_fixed: 104aca7a2311d5d99fb7fbc72ca2d83b412535a554cChris Banes mTabLayout.setTabMode(TabLayout.MODE_FIXED); 105aca7a2311d5d99fb7fbc72ca2d83b412535a554cChris Banes break; 106aca7a2311d5d99fb7fbc72ca2d83b412535a554cChris Banes case R.id.rb_tab_scrollable: 107aca7a2311d5d99fb7fbc72ca2d83b412535a554cChris Banes mTabLayout.setTabMode(TabLayout.MODE_SCROLLABLE); 108aca7a2311d5d99fb7fbc72ca2d83b412535a554cChris Banes break; 109aca7a2311d5d99fb7fbc72ca2d83b412535a554cChris Banes } 110aca7a2311d5d99fb7fbc72ca2d83b412535a554cChris Banes } 111aca7a2311d5d99fb7fbc72ca2d83b412535a554cChris Banes }); 112aca7a2311d5d99fb7fbc72ca2d83b412535a554cChris Banes 113aca7a2311d5d99fb7fbc72ca2d83b412535a554cChris Banes // Setup the initially checked item 114aca7a2311d5d99fb7fbc72ca2d83b412535a554cChris Banes switch (mTabLayout.getTabGravity()) { 115aca7a2311d5d99fb7fbc72ca2d83b412535a554cChris Banes case TabLayout.GRAVITY_CENTER: 116aca7a2311d5d99fb7fbc72ca2d83b412535a554cChris Banes ((RadioButton) findViewById(R.id.rb_tab_g_center)).setChecked(true); 117aca7a2311d5d99fb7fbc72ca2d83b412535a554cChris Banes break; 118aca7a2311d5d99fb7fbc72ca2d83b412535a554cChris Banes case TabLayout.GRAVITY_FILL: 119aca7a2311d5d99fb7fbc72ca2d83b412535a554cChris Banes ((RadioButton) findViewById(R.id.rb_tab_g_fill)).setChecked(true); 120aca7a2311d5d99fb7fbc72ca2d83b412535a554cChris Banes break; 121aca7a2311d5d99fb7fbc72ca2d83b412535a554cChris Banes } 122aca7a2311d5d99fb7fbc72ca2d83b412535a554cChris Banes 123fa2e2acf79d791a90410025daad438968550d18cAlan Viverette rg = findViewById(R.id.radiogroup_tab_gravity); 124aca7a2311d5d99fb7fbc72ca2d83b412535a554cChris Banes rg.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() { 125aca7a2311d5d99fb7fbc72ca2d83b412535a554cChris Banes @Override 126aca7a2311d5d99fb7fbc72ca2d83b412535a554cChris Banes public void onCheckedChanged(RadioGroup radioGroup, int id) { 127aca7a2311d5d99fb7fbc72ca2d83b412535a554cChris Banes switch (id) { 128aca7a2311d5d99fb7fbc72ca2d83b412535a554cChris Banes case R.id.rb_tab_g_center: 129aca7a2311d5d99fb7fbc72ca2d83b412535a554cChris Banes mTabLayout.setTabGravity(TabLayout.GRAVITY_CENTER); 130aca7a2311d5d99fb7fbc72ca2d83b412535a554cChris Banes break; 131aca7a2311d5d99fb7fbc72ca2d83b412535a554cChris Banes case R.id.rb_tab_g_fill: 132aca7a2311d5d99fb7fbc72ca2d83b412535a554cChris Banes mTabLayout.setTabGravity(TabLayout.GRAVITY_FILL); 133aca7a2311d5d99fb7fbc72ca2d83b412535a554cChris Banes break; 134aca7a2311d5d99fb7fbc72ca2d83b412535a554cChris Banes } 135aca7a2311d5d99fb7fbc72ca2d83b412535a554cChris Banes } 136aca7a2311d5d99fb7fbc72ca2d83b412535a554cChris Banes }); 137aca7a2311d5d99fb7fbc72ca2d83b412535a554cChris Banes } 138aca7a2311d5d99fb7fbc72ca2d83b412535a554cChris Banes 139aca7a2311d5d99fb7fbc72ca2d83b412535a554cChris Banes private static class CheesePagerAdapter extends PagerAdapter { 140aca7a2311d5d99fb7fbc72ca2d83b412535a554cChris Banes private final ArrayList<CharSequence> mCheeses = new ArrayList<>(); 141aca7a2311d5d99fb7fbc72ca2d83b412535a554cChris Banes 142aca7a2311d5d99fb7fbc72ca2d83b412535a554cChris Banes public void addTab(String title) { 143aca7a2311d5d99fb7fbc72ca2d83b412535a554cChris Banes mCheeses.add(title); 144aca7a2311d5d99fb7fbc72ca2d83b412535a554cChris Banes notifyDataSetChanged(); 145aca7a2311d5d99fb7fbc72ca2d83b412535a554cChris Banes } 146aca7a2311d5d99fb7fbc72ca2d83b412535a554cChris Banes 147aca7a2311d5d99fb7fbc72ca2d83b412535a554cChris Banes public void removeTab() { 148aca7a2311d5d99fb7fbc72ca2d83b412535a554cChris Banes if (!mCheeses.isEmpty()) { 149aca7a2311d5d99fb7fbc72ca2d83b412535a554cChris Banes mCheeses.remove(mCheeses.size() - 1); 150aca7a2311d5d99fb7fbc72ca2d83b412535a554cChris Banes notifyDataSetChanged(); 151aca7a2311d5d99fb7fbc72ca2d83b412535a554cChris Banes } 152aca7a2311d5d99fb7fbc72ca2d83b412535a554cChris Banes } 153aca7a2311d5d99fb7fbc72ca2d83b412535a554cChris Banes 154aca7a2311d5d99fb7fbc72ca2d83b412535a554cChris Banes @Override 155aca7a2311d5d99fb7fbc72ca2d83b412535a554cChris Banes public int getCount() { 156aca7a2311d5d99fb7fbc72ca2d83b412535a554cChris Banes return mCheeses.size(); 157aca7a2311d5d99fb7fbc72ca2d83b412535a554cChris Banes } 158aca7a2311d5d99fb7fbc72ca2d83b412535a554cChris Banes 159aca7a2311d5d99fb7fbc72ca2d83b412535a554cChris Banes @Override 160cc3292f20d59b18909fd3c1bfbf03da3e6babb7cChris Banes public int getItemPosition(Object object) { 161cc3292f20d59b18909fd3c1bfbf03da3e6babb7cChris Banes final Item item = (Item) object; 162cc3292f20d59b18909fd3c1bfbf03da3e6babb7cChris Banes final int index = mCheeses.indexOf(item.cheese); 163cc3292f20d59b18909fd3c1bfbf03da3e6babb7cChris Banes return index >= 0 ? index : POSITION_NONE; 164cc3292f20d59b18909fd3c1bfbf03da3e6babb7cChris Banes } 165cc3292f20d59b18909fd3c1bfbf03da3e6babb7cChris Banes 166cc3292f20d59b18909fd3c1bfbf03da3e6babb7cChris Banes @Override 167aca7a2311d5d99fb7fbc72ca2d83b412535a554cChris Banes public Object instantiateItem(ViewGroup container, int position) { 168cc3292f20d59b18909fd3c1bfbf03da3e6babb7cChris Banes final TextView tv = new TextView(container.getContext()); 169aca7a2311d5d99fb7fbc72ca2d83b412535a554cChris Banes tv.setText(getPageTitle(position)); 170aca7a2311d5d99fb7fbc72ca2d83b412535a554cChris Banes tv.setGravity(Gravity.CENTER); 1717b75d53b8e5584895595f801256a3d63bb68148aAurimas Liutikas TextViewCompat.setTextAppearance(tv, R.style.TextAppearance_AppCompat_Title); 172aca7a2311d5d99fb7fbc72ca2d83b412535a554cChris Banes container.addView(tv, ViewGroup.LayoutParams.MATCH_PARENT, 173aca7a2311d5d99fb7fbc72ca2d83b412535a554cChris Banes ViewGroup.LayoutParams.MATCH_PARENT); 174aca7a2311d5d99fb7fbc72ca2d83b412535a554cChris Banes 175cc3292f20d59b18909fd3c1bfbf03da3e6babb7cChris Banes Item item = new Item(); 176cc3292f20d59b18909fd3c1bfbf03da3e6babb7cChris Banes item.cheese = mCheeses.get(position); 177cc3292f20d59b18909fd3c1bfbf03da3e6babb7cChris Banes item.view = tv; 178cc3292f20d59b18909fd3c1bfbf03da3e6babb7cChris Banes return item; 179aca7a2311d5d99fb7fbc72ca2d83b412535a554cChris Banes } 180aca7a2311d5d99fb7fbc72ca2d83b412535a554cChris Banes 181aca7a2311d5d99fb7fbc72ca2d83b412535a554cChris Banes @Override 182aca7a2311d5d99fb7fbc72ca2d83b412535a554cChris Banes public boolean isViewFromObject(View view, Object object) { 183cc3292f20d59b18909fd3c1bfbf03da3e6babb7cChris Banes final Item item = (Item) object; 184cc3292f20d59b18909fd3c1bfbf03da3e6babb7cChris Banes return item.view == view; 185aca7a2311d5d99fb7fbc72ca2d83b412535a554cChris Banes } 186aca7a2311d5d99fb7fbc72ca2d83b412535a554cChris Banes 187aca7a2311d5d99fb7fbc72ca2d83b412535a554cChris Banes @Override 188aca7a2311d5d99fb7fbc72ca2d83b412535a554cChris Banes public CharSequence getPageTitle(int position) { 189aca7a2311d5d99fb7fbc72ca2d83b412535a554cChris Banes return mCheeses.get(position); 190aca7a2311d5d99fb7fbc72ca2d83b412535a554cChris Banes } 191aca7a2311d5d99fb7fbc72ca2d83b412535a554cChris Banes 192aca7a2311d5d99fb7fbc72ca2d83b412535a554cChris Banes @Override 193aca7a2311d5d99fb7fbc72ca2d83b412535a554cChris Banes public void destroyItem(ViewGroup container, int position, Object object) { 194cc3292f20d59b18909fd3c1bfbf03da3e6babb7cChris Banes final Item item = (Item) object; 195cc3292f20d59b18909fd3c1bfbf03da3e6babb7cChris Banes container.removeView(item.view); 196cc3292f20d59b18909fd3c1bfbf03da3e6babb7cChris Banes } 197cc3292f20d59b18909fd3c1bfbf03da3e6babb7cChris Banes 198cc3292f20d59b18909fd3c1bfbf03da3e6babb7cChris Banes private static class Item { 199cc3292f20d59b18909fd3c1bfbf03da3e6babb7cChris Banes TextView view; 200cc3292f20d59b18909fd3c1bfbf03da3e6babb7cChris Banes CharSequence cheese; 201aca7a2311d5d99fb7fbc72ca2d83b412535a554cChris Banes } 202aca7a2311d5d99fb7fbc72ca2d83b412535a554cChris Banes } 203aca7a2311d5d99fb7fbc72ca2d83b412535a554cChris Banes 204aca7a2311d5d99fb7fbc72ca2d83b412535a554cChris Banes} 205