Xamarin Android: Working with material design TabLayout and ViewPager
How to create a TabLayout with ViewPager, they like the picture?
http://i.imgur.com/1fgC3yv.png
First, add these references from NuGet:
- Xamarin.Android.Support.Design.23.3.0
- Xamarin.Android.Support.v4.23.3.0
- Xamarin.Android.Support.v7.AppCompat.23.3.0
- Xamarin.Android.Support.v7.RecyclerView.23.3.0
- Xamarin.Android.Support.Vector.Drawable.23.3.0
- Xamarin.Android.Support.Animated.Vector.Drawable.23.3.0
1. Making the App Material
NOTE: The app material supports API 21 later.
Create an XML file Themes located under resource / values.
<?``xml
version``=``"1.0"
encoding``=``"UTF-8"
?>
<``resources``>
``<``style
name``=``"PrimaryThemes"
parent``=``"Theme.AppCompat.Light"``>
``<``item
name``=``"windowNoTitle"``>true</``item``>
``<``item
name``=``"windowActionBar"``>false</``item``>
``<``item
name``=``"colorPrimary"``>#E53935</``item``>
``<``item
name``=``"colorPrimaryDark"``>#D32F2F</``item``>
``</``style``>
``<!--TabLayout Theme-->
``<``style
name``=``"TabLayoutThemes"
parent``=``"Widget.Design.TabLayout"``>
``<``item
name``=``"tabIndicatorColor"``>#FFFFFF</``item``> <!-- tabIndicatorColor is color of underline each tabs.
``<``item
name``=``"tabIndicatorHeight"``>2dp</``item``><!-- tabIndicatorHeight is height of underline
``<``item
name``=``"tabSelectedTextColor"``>#212121</``item``><!-- color of text when tabs be selected
``</``style``>
<``resources``>
Open AndroidManifest.xml and modify the theme to our customized theme by changing the Android: Theme attribute value.
<``application
android:allowBackup``=``"true"
android:icon``=``"@mipmap/icon"
android:label``=``"@string/app_name"
android:theme``=``"@style/PrimaryThemes"``>
Open the layout of main activity is Main.axml and add layout code:
<?``xml
version``=``"1.0"
encoding``=``"utf-8"``?>
<``LinearLayout
xmlns:android``=``"
http://schemas.android.com/apk/res/android
"
``xmlns:app``=``"
http://schemas.android.com/apk/res-auto
"
``android:orientation``=``"vertical"
``android:layout_width``=``"match_parent"
``android:layout_height``=``"match_parent"``>
``<``android.support.design.widget.TabLayout
``android:id``=``"@+id/sliding_tabs"
``style``=``"@style/TabLayoutThemes"
``android:layout_width``=``"match_parent"
``android:layout_height``=``"wrap_content"
``android:background``=``"?android:attr/colorPrimary"
``app:tabGravity``=``"fill"
``app:tabMode``=``"fixed"
/>
``<``android.support.v4.view.ViewPager
``android:id``=``"@+id/viewpager"
``android:layout_width``=``"match_parent"
``android:layout_height``=``"match_parent"
/>
</``LinearLayout``>
Fixed tabs in Main.xaml
Fixed tabs should be used when you have limited number of tabs. These tabs are fixed in position. So you have to use:
app:tabMore="fixed"
If you have many tabs you have to use app:tabMore="scrollable" instead of app:tabMore="fixed".
Finally, adding the theme in XML in style of TabLayout.
Open MainActivity.cs and write code:
tabLayout.setupWithViewPager -> Assigns the ViewPager to TabLayout
setupViewPager()-> Defines the number of tabs by setting appropriate fragment and tabname
VIewPagerAdapter -> Custom adapter class provides fragments required for the viewpager.
public class MainActivity : AppCompatActivity
``{
``private TabLayout tabLayout;
``private ViewPager viewPager;
``private int[] tabIcons = {
``Resource.Drawable.SearchWhite,
``Resource.Drawable.BookmarkWhite,
``Resource.Drawable.ChristmasWhite,
``Resource.Drawable.MenuWhite
``};
``protected override void OnCreate (Bundle savedInstanceState)
``{
``base.OnCreate (savedInstanceState);
``// Set our view from the "main" layout resource
``SetContentView (Resource.Layout.Main);
``// Get our button from the layout resource,
``// and attach an event to it
``viewPager=FindViewById<``ViewPager``>(Resource.Id.viewpager);
``setupViewPager (viewPager);
``tabLayout = FindViewById<``TabLayout``> (Resource.Id.sliding_tabs);
``tabLayout.SetupWithViewPager (viewPager);
``setupTabIcons ();
``}
``private void setupTabIcons()
``{
``tabLayout.GetTabAt (0).SetIcon(tabIcons[0]);
``tabLayout.GetTabAt (1).SetIcon(tabIcons[1]);
``tabLayout.GetTabAt (2).SetIcon(tabIcons[2]);
``tabLayout.GetTabAt (3).SetIcon(tabIcons[3]);
``}
``private Explore exploreFrg;
``private Featured featuredFrg;
``private void InditialFragment()
``{
``exploreFrg = new Explore ();
``featuredFrg = new Featured ();
``moreFrg = new More ();
``todoFrag = new Todo ();
``}
``public void setupViewPager(ViewPager viewPager)
``{
``InditialFragment ();
``ViewPagerAdapter adapter = new ViewPagerAdapter (SupportFragmentManager);
``adapter.addFragment (exploreFrg, "Explore");
``adapter.addFragment (featuredFrg, "Featured");
``viewPager.Adapter=adapter;
``}
Create a ViewPagerAdapter class and write code as below:
public class ViewPagerAdapter : FragmentPagerAdapter
``{
``private List<``Android.Support.V4.App.Fragment``> mFragmentList=new List<``Android.Support.V4.App.Fragment``>();
``private List<``string``> mFragmentTitleList=new List<``string``>();
``public ViewPagerAdapter(Android.Support.V4.App.FragmentManager manager) :base(manager)
``{
``//base.OnCreate(manager);
``}
``public override int Count{
``get {
``return mFragmentList.Count;
``}
``}
``public override Android.Support.V4.App.Fragment GetItem(int postion)
``{
``return mFragmentList [postion];
``}
``public override ICharSequence GetPageTitleFormatted(int position)
``{
``return new Java.Lang.String(mFragmentTitleList [position].ToLower());// display the title
``//return null;// display only the icon
``}
``public void addFragment(Android.Support.V4.App.Fragment fragment,string title)
``{
``mFragmentList.Add (fragment);
``mFragmentTitleList.Add (title);
``}
``}
In exploreFrg. you have to add more
<``span
class``=``"s1"``>public class Explore : Android.Support.V4.App.Fragment</``span``><``span
class``=``"s2"``> </``span``>
If you don't want to have icons in tabLayout you can remove setupTabIcons();
See Also
Source