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