TabLayout is a horizontal layout in which different tabs will be available to swipe between them using viewpager2.
In the below project, we have used two tabs login and signup tabs where we will swipe between them. TabLayout is often used with viewpager2.
ViewPager2 is a better version of ViewPager where there will be a view in which you can swipe right or left in a particular area.
In the below project, we have used viewpager2 to swipe between the login and signup pages.
Step 1: Open Android Studio. Create New Project and choose Empty Activity.
Step 2: Pre-requisites
colors.xml
<?xml version="1.0" encoding="utf-8"?> <resources> <color name="purple_200">#FFBB86FC</color> <color name="purple_500">#FF6200EE</color> <color name="purple_700">#FF3700B3</color> <color name="teal_200">#FF03DAC5</color> <color name="teal_700">#FF018786</color> <color name="black">#FF000000</color> <color name="white">#FFFFFFFF</color> <color name="lavender">#8692f7</color> </resources>
themes.xml
<resources xmlns:tools="http://schemas.android.com/tools"> <!-- Base application theme. --> <style name="Theme.LogSignSQLPractice" parent="Theme.MaterialComponents.DayNight.NoActionBar"> <!-- Primary brand color. --> <item name="colorPrimary">@color/lavender</item> <item name="colorPrimaryVariant">@color/lavender</item> <item name="colorOnPrimary">@color/white</item> <!-- Secondary brand color. --> <item name="colorSecondary">@color/teal_200</item> <item name="colorSecondaryVariant">@color/teal_700</item> <item name="colorOnSecondary">@color/black</item> <!-- Status bar color. --> <item name="android:statusBarColor">?attr/colorPrimaryVariant</item> <!-- Customize your theme here. --> </style> </resources>
Drawable
Add email, lock, and password.
viewpager_bkg.xml
<?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle"> <solid android:color="@color/white"/> <corners android:radius="40dp"/> <stroke android:color="@color/lavender" android:width="1dp"/> </shape>
tab_bkg.xml
<?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle"> <solid android:color="@color/white"/> <corners android:radius="40dp"/> </shape>
edittext_bkg.xml
<?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle"> <solid android:color="@color/white"/> <corners android:radius="20dp"/> <stroke android:color="@color/lavender" android:width="2dp"/> </shape>
Step 3: XML Layouts
activity_main.xml
<?xml version="1.0" encoding="utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@drawable/mainbkg" tools:context=".MainActivity"> <androidx.constraintlayout.widget.ConstraintLayout android:layout_width="380dp" android:layout_height="0dp" android:layout_marginBottom="20dp" app:layout_constraintTop_toTopOf="parent" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintHeight_percent=".78" app:layout_constraintVertical_bias="1"> <androidx.viewpager2.widget.ViewPager2 android:layout_width="match_parent" android:layout_height="630dp" android:id="@+id/view_pager" app:layout_constraintVertical_bias="0" android:background="@drawable/viewpager_bkg" app:layout_constraintTop_toTopOf="parent" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintEnd_toEndOf="parent"/> <com.google.android.material.tabs.TabLayout android:layout_width="match_parent" android:layout_height="60dp" android:id="@+id/tab_layout" app:layout_constraintVertical_bias="0" android:background="@drawable/tab_bkg" app:layout_constraintTop_toTopOf="parent" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintEnd_toEndOf="parent"/> </androidx.constraintlayout.widget.ConstraintLayout> </androidx.constraintlayout.widget.ConstraintLayout>
fragment_login_tab.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context=".LoginTabFragment"> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical"> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical" android:layout_marginTop="20dp" android:padding="20dp"> <ImageView android:layout_width="wrap_content" android:layout_height="200dp" android:src="@drawable/loginimg"/> <EditText android:layout_width="300dp" android:layout_height="60dp" android:layout_gravity="center" android:id="@+id/login_email" android:layout_marginTop="30dp" android:padding="8dp" android:hint="Email" android:drawableLeft="@drawable/baseline_email_24" android:drawablePadding="8dp" android:background="@drawable/edittext_bkg"/> <EditText android:layout_width="300dp" android:layout_height="60dp" android:layout_gravity="center" android:id="@+id/login_password" android:layout_marginTop="20dp" android:padding="8dp" android:hint="Password" android:inputType="textPassword" android:drawableLeft="@drawable/baseline_lock_24" android:drawablePadding="8dp" android:background="@drawable/edittext_bkg"/> <Button android:layout_width="300dp" android:layout_height="70dp" android:layout_gravity="center" android:layout_marginTop="30dp" android:id="@+id/login_button" android:textSize="18sp" android:text="Login" app:cornerRadius = "30dp"/> </LinearLayout> </LinearLayout> </LinearLayout>
fragment_signup_tab.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context=".SignupTabFragment"> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical"> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical" android:layout_marginTop="20dp" android:padding="20dp"> <ImageView android:layout_width="wrap_content" android:layout_height="200dp" android:src="@drawable/signimg"/> <EditText android:layout_width="300dp" android:layout_height="60dp" android:layout_gravity="center" android:id="@+id/signup_email" android:layout_marginTop="30dp" android:padding="8dp" android:hint="Email" android:drawableLeft="@drawable/baseline_email_24" android:drawablePadding="8dp" android:background="@drawable/edittext_bkg"/> <EditText android:layout_width="300dp" android:layout_height="60dp" android:layout_gravity="center" android:id="@+id/signup_password" android:layout_marginTop="20dp" android:padding="8dp" android:hint="Password" android:inputType="textPassword" android:drawableLeft="@drawable/baseline_lock_24" android:drawablePadding="8dp" android:background="@drawable/edittext_bkg"/> <EditText android:layout_width="300dp" android:layout_height="60dp" android:layout_gravity="center" android:id="@+id/signup_confirm" android:layout_marginTop="20dp" android:padding="8dp" android:hint="Confirm Password" android:inputType="textPassword" android:drawableLeft="@drawable/baseline_password_24" android:drawablePadding="8dp" android:background="@drawable/edittext_bkg"/> <Button android:layout_width="300dp" android:layout_height="70dp" android:layout_gravity="center" android:layout_marginTop="30dp" android:id="@+id/signup_button" android:textSize="18sp" android:text="Signup" app:cornerRadius = "30dp"/> </LinearLayout> </LinearLayout> </LinearLayout>
Step 4: Java Files
ViewPagerAdapter.java
package com.example.signlogintab; import androidx.annotation.NonNull; import androidx.fragment.app.Fragment; import androidx.fragment.app.FragmentManager; import androidx.lifecycle.Lifecycle; import androidx.viewpager2.adapter.FragmentStateAdapter; public class ViewPagerAdapter extends FragmentStateAdapter { public ViewPagerAdapter(@NonNull FragmentManager fragmentManager, @NonNull Lifecycle lifecycle) { super(fragmentManager, lifecycle); } @NonNull @Override public Fragment createFragment(int position) { if (position == 1){ return new SignupTabFragment(); } return new LoginTabFragment(); } @Override public int getItemCount() { return 2; } }
MainActivity.java
package com.example.signlogintab; import androidx.appcompat.app.AppCompatActivity; import androidx.fragment.app.FragmentManager; import androidx.viewpager2.widget.ViewPager2; import android.os.Bundle; import com.google.android.material.tabs.TabLayout; public class MainActivity extends AppCompatActivity { private TabLayout tabLayout; private ViewPager2 viewPager2; private ViewPagerAdapter adapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); tabLayout = findViewById(R.id.tab_layout); viewPager2 = findViewById(R.id.view_pager); tabLayout.addTab(tabLayout.newTab().setText("Login")); tabLayout.addTab(tabLayout.newTab().setText("Signup")); FragmentManager fragmentManager = getSupportFragmentManager(); adapter = new ViewPagerAdapter(fragmentManager, getLifecycle()); viewPager2.setAdapter(adapter); tabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() { @Override public void onTabSelected(TabLayout.Tab tab) { viewPager2.setCurrentItem(tab.getPosition()); } @Override public void onTabUnselected(TabLayout.Tab tab) { } @Override public void onTabReselected(TabLayout.Tab tab) { } }); viewPager2.registerOnPageChangeCallback(new ViewPager2.OnPageChangeCallback() { @Override public void onPageSelected(int position) { tabLayout.selectTab(tabLayout.getTabAt(position)); } }); } }
If you find this article easy and insightful, please share it with your friends.
If you have any queries or errors related to the above context, please feel free to reach out through the comment section.
For a detailed explanation, please check our YouTube Video: Login and Signup in Android Studio using TabLayout and ViewPager2
Check my other articles on Android Knowledge: https://androidknowledge.com