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