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