Industrial Training




Android Web Service


In this tutorial, we will create the basic user registration and log-in module using Volley library and JSON. Volley is an HTTP Library which provides the facilities for network connectivity for our app.
The web API of registration and login is created using PHP with MySQL. Before implementing the client side Android application code, first look at the server side API code at https://www.mcatutorials.com/android-volley-library-registration-login-logout.
In Android application, we will create the three activity class for user registration, user log-in and display the user detail in main activity (as a profile).
Create an activity_main.xml in layout and add the following code. This activity is used to display the detail of the user profile.


activity_main.xml


< ?xml version="1.0" encoding="utf-8"?>  
< android.support.constraint.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"  
    tools:context="example.javatpoint.com.kotlinvolleyregistrationloginsystem.MainActivity">  
   
    < LinearLayout  
        android:layout_width="match_parent"  
        android:layout_height="fill_parent"  
        android:layout_marginBottom="8dp"  
        android:layout_marginEnd="8dp"  
        android:layout_marginStart="8dp"  
        android:layout_marginTop="8dp"  
        android:orientation="vertical"  
        app:layout_constraintBottom_toBottomOf="parent"  
        app:layout_constraintEnd_toEndOf="parent"  
        app:layout_constraintHorizontal_bias="0.0"  
        app:layout_constraintStart_toStartOf="parent"  
        app:layout_constraintTop_toTopOf="parent"  
        app:layout_constraintVertical_bias="0.0">  
  
        < TextView  
            android:layout_width="fill_parent"  
            android:layout_height="wrap_content"  
            android:gravity="center"  
            android:text="Welcome to Profile"  
            android:textAppearance="@style/Base.TextAppearance.AppCompat.Large" />  
  
        < TableLayout  
            android:layout_width="match_parent"  
            android:layout_height="wrap_content"  
            android:layout_marginTop="50dp">  
  
  
            < TableRow>  
  
                < TextView  
                    android:layout_width="wrap_content"  
                    android:layout_height="wrap_content"  
                    android:padding="10dp"  
                    android:text="Id"  
                    android:textAppearance="@style/Base.TextAppearance.AppCompat.Large" />  
  
                < TextView  
                    android:id="@+id/textViewId"  
                    android:layout_width="wrap_content"  
                    android:layout_height="wrap_content"  
                    android:padding="10dp"  
                    android:text="id"  
                    android:textAppearance="@style/Base.TextAppearance.AppCompat.Medium" />  
  
            < /TableRow>  
  
            < TableRow>  
  
                < TextView  
                    android:layout_width="wrap_content"  
                    android:layout_height="wrap_content"  
                    android:padding="10dp"  
                    android:text="Username"  
                    android:textAppearance="@style/Base.TextAppearance.AppCompat.Large" />  
  
                < TextView  
                    android:id="@+id/textViewUsername"  
                    android:layout_width="wrap_content"  
                    android:layout_height="wrap_content"  
                    android:padding="10dp"  
                    android:text="username"  
                    android:textAppearance="@style/Base.TextAppearance.AppCompat.Medium" />  
  
            < /TableRow>  
  
            < TableRow>  
  
                < TextView  
                    android:layout_width="wrap_content"  
                    android:layout_height="wrap_content"  
                    android:padding="10dp"  
                    android:text="Email"  
                    android:textAppearance="@style/Base.TextAppearance.AppCompat.Large" />  
  
                < TextView  
                    android:id="@+id/textViewEmail"  
                    android:layout_width="wrap_content"  
                    android:layout_height="wrap_content"  
                    android:padding="10dp"  
                    android:text="useremail"  
                    android:textAppearance="@style/Base.TextAppearance.AppCompat.Medium" />  
  
            < /TableRow>  
  
            < TableRow>  
  
                < TextView  
                    android:layout_width="wrap_content"  
                    android:layout_height="wrap_content"  
                    android:padding="10dp"  
                    android:text="Gender"  
                    android:textAppearance="@style/Base.TextAppearance.AppCompat.Large" />  
  
                < TextView  
                    android:id="@+id/textViewGender"  
                    android:layout_width="wrap_content"  
                    android:layout_height="wrap_content"  
                    android:padding="10dp"  
                    android:text="gender"  
                    android:textAppearance="@style/Base.TextAppearance.AppCompat.Medium" />  
  
            < /TableRow>  
  
  
        < /TableLayout>  
  
        < Button  
            android:id="@+id/buttonLogout"  
            android:layout_width="210dp"  
            android:layout_height="50dp"  
            android:layout_marginTop="150dp"  
            android:layout_marginLeft="75dp"  
            android:text="Logout" />  
    < /LinearLayout>  
  
< /android.support.constraint.ConstraintLayout>  
  
< android.support.constraint.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"  
    tools:context="example.javatpoint.com.kotlinvolleyregistrationloginsystem.MainActivity">  
  
    < LinearLayout  
        android:layout_width="match_parent"  
        android:layout_height="fill_parent"  
        android:layout_marginBottom="8dp"  
        android:layout_marginEnd="8dp"  
        android:layout_marginStart="8dp"  
        android:layout_marginTop="8dp"  
        android:orientation="vertical"  
        app:layout_constraintBottom_toBottomOf="parent"  
        app:layout_constraintEnd_toEndOf="parent"  
        app:layout_constraintHorizontal_bias="0.0"  
        app:layout_constraintStart_toStartOf="parent"  
        app:layout_constraintTop_toTopOf="parent"  
        app:layout_constraintVertical_bias="0.0">  
  
        < TextView  
            android:layout_width="fill_parent"  
            android:layout_height="wrap_content"  
            android:gravity="center"  
            android:text="Welcome to Profile"  
            android:textAppearance="@style/Base.TextAppearance.AppCompat.Large" />  
  
        < TableLayout  
            android:layout_width="match_parent"  
            android:layout_height="wrap_content"  
            android:layout_marginTop="50dp">  
  
  
            < TableRow>  
  
                < TextView  
                    android:layout_width="wrap_content"  
                    android:layout_height="wrap_content"  
                    android:padding="10dp"  
                    android:text="Id"  
                    android:textAppearance="@style/Base.TextAppearance.AppCompat.Large" />  
  
                < TextView  
                    android:id="@+id/textViewId"  
                    android:layout_width="wrap_content"  
                    android:layout_height="wrap_content"  
                    android:padding="10dp"  
                    android:text="id"  
                    android:textAppearance="@style/Base.TextAppearance.AppCompat.Medium" />  
  
            < /TableRow>  
  
            < TableRow>  
  
                < TextView  
                    android:layout_width="wrap_content"  
                    android:layout_height="wrap_content"  
                    android:padding="10dp"  
                    android:text="Username"  
                    android:textAppearance="@style/Base.TextAppearance.AppCompat.Large" />  
  
                < TextView  
                    android:id="@+id/textViewUsername"  
                    android:layout_width="wrap_content"  
                    android:layout_height="wrap_content"  
                    android:padding="10dp"  
                    android:text="username"  
                    android:textAppearance="@style/Base.TextAppearance.AppCompat.Medium" />  
  
            < /TableRow>  
  
            < TableRow>  
  
                < TextView  
                    android:layout_width="wrap_content"  
                    android:layout_height="wrap_content"  
                    android:padding="10dp"  
                    android:text="Email"  
                    android:textAppearance="@style/Base.TextAppearance.AppCompat.Large" />  
  
                < TextView  
                    android:id="@+id/textViewEmail"  
                    android:layout_width="wrap_content"  
                    android:layout_height="wrap_content"  
                    android:padding="10dp"  
                    android:text="useremail"  
                    android:textAppearance="@style/Base.TextAppearance.AppCompat.Medium" />  
  
            < /TableRow>  
  
            < TableRow>  
  
                < TextView  
                    android:layout_width="wrap_content"  
                    android:layout_height="wrap_content"  
                    android:padding="10dp"  
                    android:text="Gender"  
                    android:textAppearance="@style/Base.TextAppearance.AppCompat.Large" />  
  
                < TextView  
                    android:id="@+id/textViewGender"  
                    android:layout_width="wrap_content"  
                    android:layout_height="wrap_content"  
                    android:padding="10dp"  
                    android:text="gender"  
                    android:textAppearance="@style/Base.TextAppearance.AppCompat.Medium" />  
  
            < /TableRow>  
  
  
        < /TableLayout>  
  
        < Button  
            android:id="@+id/buttonLogout"  
            android:layout_width="210dp"  
            android:layout_height="50dp"  
            android:layout_marginTop="150dp"  
            android:layout_marginLeft="75dp"  
            android:text="Logout" />  
    < /LinearLayout>  
  
< /android.support.constraint.ConstraintLayout>

activity_login.xml


< ?xml version="1.0" encoding="utf-8"?>  
< android.support.constraint.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"  
    tools:context="example.javatpoint.com.kotlinvolleyregistrationloginsystem.LoginActivity">  
  
    < TextView  
        android:layout_width="fill_parent"  
        android:layout_height="wrap_content"  
        android:layout_marginEnd="8dp"  
        android:layout_marginStart="8dp"  
        android:layout_marginTop="16dp"  
        android:gravity="center"  
        android:text="Login"  
        android:textAppearance="@style/Base.TextAppearance.AppCompat.Large"  
        app:layout_constraintEnd_toEndOf="parent"  
        app:layout_constraintHorizontal_bias="1.0"  
        app:layout_constraintStart_toStartOf="parent"  
        app:layout_constraintTop_toTopOf="parent" />  
  
    < EditText  
        android:id="@+id/etUserName"  
        android:layout_width="fill_parent"  
        android:layout_height="wrap_content"  
        android:layout_marginBottom="8dp"  
        android:layout_marginEnd="8dp"  
        android:layout_marginStart="8dp"  
        android:layout_marginTop="8dp"  
        android:ems="10"  
        android:inputType="textPersonName"  
        android:hint="user name"  
        app:layout_constraintBottom_toBottomOf="parent"  
        app:layout_constraintEnd_toEndOf="parent"  
        app:layout_constraintHorizontal_bias="0.0"  
        app:layout_constraintStart_toStartOf="parent"  
        app:layout_constraintTop_toTopOf="parent"  
        app:layout_constraintVertical_bias="0.144" />  
  
    < EditText  
        android:id="@+id/etUserPassword"  
        android:layout_width="fill_parent"  
        android:layout_height="wrap_content"  
        android:layout_marginEnd="8dp"  
        android:layout_marginStart="8dp"  
        android:layout_marginTop="8dp"  
        android:hint="password"  
        android:ems="10"  
        android:inputType="textPassword"  
        app:layout_constraintEnd_toEndOf="parent"  
        app:layout_constraintStart_toStartOf="parent"  
        app:layout_constraintTop_toBottomOf="@+id/etUserName" />  
  
    < Button  
        android:id="@+id/btnLogin"  
        android:layout_width="210dp"  
        android:layout_height="50dp"  
        android:layout_marginBottom="8dp"  
        android:layout_marginEnd="8dp"  
        android:layout_marginStart="8dp"  
        android:layout_marginTop="8dp"  
        android:text="Login"  
        app:layout_constraintBottom_toBottomOf="parent"  
        app:layout_constraintEnd_toEndOf="parent"  
        app:layout_constraintStart_toStartOf="parent"  
        app:layout_constraintTop_toBottomOf="@+id/etUserName"  
        app:layout_constraintVertical_bias="0.754" />  
  
    < TextView  
        android:id="@+id/tvRegister"  
        android:layout_width="wrap_content"  
        android:layout_height="wrap_content"  
        android:layout_marginBottom="8dp"  
        android:layout_marginEnd="8dp"  
        android:layout_marginStart="8dp"  
        android:layout_marginTop="8dp"  
        android:gravity="center"  
        android:text="Create New Account\n Register Here"  
        app:layout_constraintBottom_toBottomOf="parent"  
        app:layout_constraintEnd_toEndOf="parent"  
        app:layout_constraintStart_toStartOf="parent"  
        app:layout_constraintTop_toBottomOf="@+id/btnLogin"  
        app:layout_constraintVertical_bias="0.405" />  
  
    < ProgressBar  
        android:id="@+id/progressBar"  
        android:visibility="gone"  
        style="?android:attr/progressBarStyle"  
        android:layout_width="wrap_content"  
        android:layout_height="wrap_content"  
        android:layout_marginBottom="8dp"  
        android:layout_marginEnd="8dp"  
        android:layout_marginStart="8dp"  
        android:layout_marginTop="8dp"  
        app:layout_constraintBottom_toBottomOf="parent"  
        app:layout_constraintEnd_toEndOf="parent"  
        app:layout_constraintStart_toStartOf="parent"  
        app:layout_constraintTop_toTopOf="parent"  
        app:layout_constraintVertical_bias="0.456" />  
  
< /android.support.constraint.ConstraintLayout>  
< ?xml version="1.0" encoding="utf-8"?>  
< android.support.constraint.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"  
    tools:context="example.javatpoint.com.kotlinvolleyregistrationloginsystem.LoginActivity">  
  
    < TextView  
        android:layout_width="fill_parent"  
        android:layout_height="wrap_content"  
        android:layout_marginEnd="8dp"  
        android:layout_marginStart="8dp"  
        android:layout_marginTop="16dp"  
        android:gravity="center"  
        android:text="Login"  
        android:textAppearance="@style/Base.TextAppearance.AppCompat.Large"  
        app:layout_constraintEnd_toEndOf="parent"  
        app:layout_constraintHorizontal_bias="1.0"  
        app:layout_constraintStart_toStartOf="parent"  
        app:layout_constraintTop_toTopOf="parent" />  
  
    < EditText  
        android:id="@+id/etUserName"  
        android:layout_width="fill_parent"  
        android:layout_height="wrap_content"  
        android:layout_marginBottom="8dp"  
        android:layout_marginEnd="8dp"  
        android:layout_marginStart="8dp"  
        android:layout_marginTop="8dp"  
        android:ems="10"  
        android:inputType="textPersonName"  
        android:hint="user name"  
        app:layout_constraintBottom_toBottomOf="parent"  
        app:layout_constraintEnd_toEndOf="parent"  
        app:layout_constraintHorizontal_bias="0.0"  
        app:layout_constraintStart_toStartOf="parent"  
        app:layout_constraintTop_toTopOf="parent"  
        app:layout_constraintVertical_bias="0.144" />  
  
    < EditText  
        android:id="@+id/etUserPassword"  
        android:layout_width="fill_parent"  
        android:layout_height="wrap_content"  
        android:layout_marginEnd="8dp"  
        android:layout_marginStart="8dp"  
        android:layout_marginTop="8dp"  
        android:hint="password"  
        android:ems="10"  
        android:inputType="textPassword"  
        app:layout_constraintEnd_toEndOf="parent"  
        app:layout_constraintStart_toStartOf="parent"  
        app:layout_constraintTop_toBottomOf="@+id/etUserName" />  
  
    < Button  
        android:id="@+id/btnLogin"  
        android:layout_width="210dp"  
        android:layout_height="50dp"  
        android:layout_marginBottom="8dp"  
        android:layout_marginEnd="8dp"  
        android:layout_marginStart="8dp"  
        android:layout_marginTop="8dp"  
        android:text="Login"  
        app:layout_constraintBottom_toBottomOf="parent"  
        app:layout_constraintEnd_toEndOf="parent"  
        app:layout_constraintStart_toStartOf="parent"  
        app:layout_constraintTop_toBottomOf="@+id/etUserName"  
        app:layout_constraintVertical_bias="0.754" />  
  
    < TextView  
        android:id="@+id/tvRegister"  
        android:layout_width="wrap_content"  
        android:layout_height="wrap_content"  
        android:layout_marginBottom="8dp"  
        android:layout_marginEnd="8dp"  
        android:layout_marginStart="8dp"  
        android:layout_marginTop="8dp"  
        android:gravity="center"  
        android:text="Create New Account\n Register Here"  
        app:layout_constraintBottom_toBottomOf="parent"  
        app:layout_constraintEnd_toEndOf="parent"  
        app:layout_constraintStart_toStartOf="parent"  
        app:layout_constraintTop_toBottomOf="@+id/btnLogin"  
        app:layout_constraintVertical_bias="0.405" />  
  
    < ProgressBar  
        android:id="@+id/progressBar"  
        android:visibility="gone"  
        style="?android:attr/progressBarStyle"  
        android:layout_width="wrap_content"  
        android:layout_height="wrap_content"  
        android:layout_marginBottom="8dp"  
        android:layout_marginEnd="8dp"  
        android:layout_marginStart="8dp"  
        android:layout_marginTop="8dp"  
        app:layout_constraintBottom_toBottomOf="parent"  
        app:layout_constraintEnd_toEndOf="parent"  
        app:layout_constraintStart_toStartOf="parent"  
        app:layout_constraintTop_toTopOf="parent"  
        app:layout_constraintVertical_bias="0.456" />  
  
< /android.support.constraint.ConstraintLayout>  

Create an activity_register.xml file in the layout directory with following code. This activity is used for user registration UI.


activity_register.xml


< ?xml version="1.0" encoding="utf-8"?>  
< android.support.constraint.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"  
    tools:context="example.javatpoint.com.kotlinvolleyregistrationloginsystem.RegisterActivity">  
  
  
    < LinearLayout  
        android:layout_width="match_parent"  
        android:layout_height="519dp"  
        android:layout_centerVertical="true"  
        android:layout_marginBottom="8dp"  
        android:layout_marginEnd="8dp"  
        android:layout_marginStart="8dp"  
        android:layout_marginTop="8dp"  
        android:orientation="vertical"  
        android:padding="10dp"  
        app:layout_constraintBottom_toBottomOf="parent"  
        app:layout_constraintEnd_toEndOf="parent"  
        app:layout_constraintStart_toStartOf="parent"  
        app:layout_constraintTop_toTopOf="parent"  
        app:layout_constraintVertical_bias="0.0">  
  
        < TextView  
            android:layout_width="fill_parent"  
            android:layout_height="wrap_content"  
            android:text="Register"  
            android:gravity="center"  
            android:textAppearance="@style/Base.TextAppearance.AppCompat.Large" />  
  
        < EditText  
            android:id="@+id/editTextUsername"  
            android:layout_width="match_parent"  
            android:layout_height="wrap_content"  
            android:layout_marginBottom="8dp"  
            android:layout_marginTop="20dp"  
            android:hint="Username"  
            android:inputType="text" />  
  
        < EditText  
            android:id="@+id/editTextEmail"  
            android:layout_width="match_parent"  
            android:layout_height="wrap_content"  
            android:layout_marginBottom="8dp"  
            android:layout_marginTop="8dp"  
            android:hint="Email"  
            android:inputType="textEmailAddress" />  
  
        < EditText  
            android:id="@+id/editTextPassword"  
            android:layout_width="match_parent"  
            android:layout_height="wrap_content"  
            android:layout_marginBottom="8dp"  
            android:layout_marginTop="8dp"  
            android:fontFamily="sans-serif"  
            android:hint="Password"  
            android:inputType="textPassword" />  
  
        < RadioGroup  
            android:id="@+id/radioGender"  
            android:layout_width="match_parent"  
            android:layout_height="wrap_content"  
            android:layout_marginBottom="8dp"  
            android:layout_marginTop="8dp"  
            android:orientation="horizontal">  
  
            < RadioButton  
                android:id="@+id/radioButtonMale"  
                android:layout_width="wrap_content"  
                android:layout_height="wrap_content"  
                android:checked="true"  
                android:text="Male" />  
  
  
            < RadioButton  
                android:id="@+id/radioButtonFemale"  
                android:layout_width="wrap_content"  
                android:layout_height="wrap_content"  
                android:text="Female" />  
  
        < /RadioGroup>  
  
        < Button  
            android:id="@+id/buttonRegister"  
            android:layout_width="match_parent"  
            android:layout_height="wrap_content"  
            android:layout_marginBottom="8dp"  
            android:layout_marginTop="90dp"  
            android:text="Register" />  
  
        < TextView  
            android:id="@+id/textViewLogin"  
            android:layout_width="match_parent"  
            android:layout_height="wrap_content"  
            android:layout_marginBottom="8dp"  
            android:layout_marginTop="8dp"  
            android:text="Already Registered?\nLogin Here"  
            android:textAlignment="center"  
            android:textAppearance="@style/Base.TextAppearance.AppCompat.Medium" />  
    < /LinearLayout>  
  
    < ProgressBar  
        android:visibility="gone"  
        android:id="@+id/progressBar"  
        android:layout_width="wrap_content"  
        android:layout_height="wrap_content"  
        android:layout_centerHorizontal="true"  
        android:layout_centerVertical="true" />  
  
< /android.support.constraint.ConstraintLayout>  
< ?xml version="1.0" encoding="utf-8"?>  
< android.support.constraint.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"  
    tools:context="example.javatpoint.com.kotlinvolleyregistrationloginsystem.RegisterActivity">  
  
  
    < LinearLayout  
        android:layout_width="match_parent"  
        android:layout_height="519dp"  
        android:layout_centerVertical="true"  
        android:layout_marginBottom="8dp"  
        android:layout_marginEnd="8dp"  
        android:layout_marginStart="8dp"  
        android:layout_marginTop="8dp"  
        android:orientation="vertical"  
        android:padding="10dp"  
        app:layout_constraintBottom_toBottomOf="parent"  
        app:layout_constraintEnd_toEndOf="parent"  
        app:layout_constraintStart_toStartOf="parent"  
        app:layout_constraintTop_toTopOf="parent"  
        app:layout_constraintVertical_bias="0.0">  
  
        < TextView  
            android:layout_width="fill_parent"  
            android:layout_height="wrap_content"  
            android:text="Register"  
            android:gravity="center"  
            android:textAppearance="@style/Base.TextAppearance.AppCompat.Large" />  
  
        < EditText  
            android:id="@+id/editTextUsername"  
            android:layout_width="match_parent"  
            android:layout_height="wrap_content"  
            android:layout_marginBottom="8dp"  
            android:layout_marginTop="20dp"  
            android:hint="Username"  
            android:inputType="text" />  
  
        < EditText  
            android:id="@+id/editTextEmail"  
            android:layout_width="match_parent"  
            android:layout_height="wrap_content"  
            android:layout_marginBottom="8dp"  
            android:layout_marginTop="8dp"  
            android:hint="Email"  
            android:inputType="textEmailAddress" />  
  
        < EditText  
            android:id="@+id/editTextPassword"  
            android:layout_width="match_parent"  
            android:layout_height="wrap_content"  
            android:layout_marginBottom="8dp"  
            android:layout_marginTop="8dp"  
            android:fontFamily="sans-serif"  
            android:hint="Password"  
            android:inputType="textPassword" />  
  
        < RadioGroup  
            android:id="@+id/radioGender"  
            android:layout_width="match_parent"  
            android:layout_height="wrap_content"  
            android:layout_marginBottom="8dp"  
            android:layout_marginTop="8dp"  
            android:orientation="horizontal">  
  
            < RadioButton  
                android:id="@+id/radioButtonMale"  
                android:layout_width="wrap_content"  
                android:layout_height="wrap_content"  
                android:checked="true"  
                android:text="Male" />  
  
  
            < RadioButton  
                android:id="@+id/radioButtonFemale"  
                android:layout_width="wrap_content"  
                android:layout_height="wrap_content"  
                android:text="Female" />  
  
        < /RadioGroup>  
  
        < Button  
            android:id="@+id/buttonRegister"  
            android:layout_width="match_parent"  
            android:layout_height="wrap_content"  
            android:layout_marginBottom="8dp"  
            android:layout_marginTop="90dp"  
            android:text="Register" />  
  
        < TextView  
            android:id="@+id/textViewLogin"  
            android:layout_width="match_parent"  
            android:layout_height="wrap_content"  
            android:layout_marginBottom="8dp"  
            android:layout_marginTop="8dp"  
            android:text="Already Registered?\nLogin Here"  
            android:textAlignment="center"  
            android:textAppearance="@style/Base.TextAppearance.AppCompat.Medium" />  
    < /LinearLayout>  
  
    < ProgressBar  
        android:visibility="gone"  
        android:id="@+id/progressBar"  
        android:layout_width="wrap_content"  
        android:layout_height="wrap_content"  
        android:layout_centerHorizontal="true"  
        android:layout_centerVertical="true" />  
  
< /android.support.constraint.ConstraintLayout>  

Add the volley library dependency in build.gradle file.


build.gradle


dependencies {  
    implementation fileTree(dir: 'libs', include: ['*.jar'])  
    implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"  
    implementation 'com.android.support:appcompat-v7:26.1.0'  
    implementation 'com.android.support.constraint:constraint-layout:1.1.3'  
    testImplementation 'junit:junit:4.12'  
    implementation 'com.android.volley:volley:1.0.0'  
}  
dependencies {  
    implementation fileTree(dir: 'libs', include: ['*.jar'])  
    implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"  
    implementation 'com.android.support:appcompat-v7:26.1.0'  
    implementation 'com.android.support.constraint:constraint-layout:1.1.3'  
    testImplementation 'junit:junit:4.12'  
    implementation 'com.android.volley:volley:1.0.0'  
}  

Create a data model class named as User.kt with the following code.


User.kt


package example.javatpoint.com.kotlinvolleyregistrationloginsystem  
  
class User(var id: Int, var name: String?, var email: String?, var gender: String?)  
package example.javatpoint.com.kotlinvolleyregistrationloginsystem  
  
class User(var id: Int, var name: String?, var email: String?, var gender: String?) 

We need to define our URL that calls the API of server-side.
Create an URLs.kt class and define the URL.


URLs.kt


package example.javatpoint.com.kotlinvolleyregistrationloginsystem  
  
object URLs {  
    private val ROOT_URL = "http://192.168.1.35/androidphpmysql/registrationapi.php?apicall="  
    val URL_REGISTER = ROOT_URL + "signup"  
    val URL_LOGIN = ROOT_URL + "login"  
}  
package example.javatpoint.com.kotlinvolleyregistrationloginsystem  
  
object URLs {  
    private val ROOT_URL = "http://192.168.1.35/androidphpmysql/registrationapi.php?apicall="  
    val URL_REGISTER = ROOT_URL + "signup"  
    val URL_LOGIN = ROOT_URL + "login"  
}  

VolleySingleton.kt


package example.javatpoint.com.kotlinvolleyregistrationloginsystem  
  
import android.content.Context  
import com.android.volley.Request  
import com.android.volley.RequestQueue  
import com.android.volley.toolbox.Volley  
  
class VolleySingleton private constructor(context: Context) {  
    private var mRequestQueue: RequestQueue  
  
    // applicationContext is key, it keeps you from leaking the  
    // Activity or BroadcastReceiver if someone passes one in.  
    val requestQueue: RequestQueue  
        get() {  
            if (mRequestQueue == null) {  
                mRequestQueue = Volley.newRequestQueue(mCtx?.applicationContext)  
            }  
            return mRequestQueue  
        }  
  
    init {  
        mCtx = context  
        mRequestQueue = requestQueue  
    }  
  
    fun < T> addToRequestQueue(req: Request) {  
        requestQueue.add(req)  
    }  
  
    companion object {  
        private var mInstance: VolleySingleton? = null  
        private var mCtx: Context? = null  
  
        @Synchronized  
        fun getInstance(context: Context): VolleySingleton {  
            if (mInstance == null) {  
                mInstance = VolleySingleton(context)  
            }  
            return mInstance as VolleySingleton  
        }  
    }  
}  
package example.javatpoint.com.kotlinvolleyregistrationloginsystem  
  
import android.content.Context  
import com.android.volley.Request  
import com.android.volley.RequestQueue  
import com.android.volley.toolbox.Volley  
  
class VolleySingleton private constructor(context: Context) {  
    private var mRequestQueue: RequestQueue  
  
    // applicationContext is key, it keeps you from leaking the  
    // Activity or BroadcastReceiver if someone passes one in.  
    val requestQueue: RequestQueue  
        get() {  
            if (mRequestQueue == null) {  
                mRequestQueue = Volley.newRequestQueue(mCtx?.applicationContext)  
            }  
            return mRequestQueue  
        }  
  
    init {  
        mCtx = context  
        mRequestQueue = requestQueue  
    }  
  
    fun < T> addToRequestQueue(req: Request) {  
        requestQueue.add(req)  
    }  
  
    companion object {  
        private var mInstance: VolleySingleton? = null  
        private var mCtx: Context? = null  
  
        @Synchronized  
        fun getInstance(context: Context): VolleySingleton {  
            if (mInstance == null) {  
                mInstance = VolleySingleton(context)  
            }  
            return mInstance as VolleySingleton  
        }  
    }  
}

Create a class named as SharedPreferences.kt. In this class, we use the SharedPreferences class to store the user detail. The SharedPreferences class contains four methods with the following functionalities:


  • userLogin(): This function is used to store the user information in SharedPreferences after log-in.
  • isLoggedIn: This method checks whether the user is already log-in or not.
  • user: User get(): This method gets the user information if log-in.
  • logout(): This function clears the SharedPreferences data and makes user log-out.

SharedPrefManager.kt


package example.javatpoint.com.kotlinvolleyregistrationloginsystem  
  
import android.content.Context  
import android.content.Intent  
  
class SharedPrefManager private constructor(context: Context) {  
  
    //this method will checker whether user is already logged in or not  
    val isLoggedIn: Boolean  
        get() {  
            val sharedPreferences = ctx?.getSharedPreferences(SHARED_PREF_NAME, Context.MODE_PRIVATE)  
            return sharedPreferences?.getString(KEY_USERNAME, null) != null  
        }  
  
    //this method will give the logged in user  
    val user: User  
        get() {  
            val sharedPreferences = ctx?.getSharedPreferences(SHARED_PREF_NAME, Context.MODE_PRIVATE)  
            return User(  
                    sharedPreferences!!.getInt(KEY_ID, -1),  
                    sharedPreferences.getString(KEY_USERNAME, null),  
                    sharedPreferences.getString(KEY_EMAIL, null),  
                    sharedPreferences.getString(KEY_GENDER, null)  
            )  
        }  
  
    init {  
        ctx = context  
    }  
  
    //this method will store the user data in shared preferences  
    fun userLogin(user: User) {  
        val sharedPreferences = ctx?.getSharedPreferences(SHARED_PREF_NAME, Context.MODE_PRIVATE)  
        val editor = sharedPreferences?.edit()  
        editor?.putInt(KEY_ID, user.id)  
        editor?.putString(KEY_USERNAME, user.name)  
        editor?.putString(KEY_EMAIL, user.email)  
        editor?.putString(KEY_GENDER, user.gender)  
        editor?.apply()  
    }  
  
    //this method will logout the user  
    fun logout() {  
        val sharedPreferences = ctx?.getSharedPreferences(SHARED_PREF_NAME, Context.MODE_PRIVATE)  
        val editor = sharedPreferences?.edit()  
        editor?.clear()  
        editor?.apply()  
        ctx?.startActivity(Intent(ctx, LoginActivity::class.java))  
    }  
  
    companion object {  
  
        private val SHARED_PREF_NAME = "volleyregisterlogin"  
        private val KEY_USERNAME = "keyusername"  
        private val KEY_EMAIL = "keyemail"  
        private val KEY_GENDER = "keygender"  
        private val KEY_ID = "keyid"  
        private var mInstance: SharedPrefManager? = null  
        private var ctx: Context? = null  
        @Synchronized  
        fun getInstance(context: Context): SharedPrefManager {  
            if (mInstance == null) {  
                mInstance = SharedPrefManager(context)  
            }  
            return mInstance as SharedPrefManager  
        }  
    }  
}  
package example.javatpoint.com.kotlinvolleyregistrationloginsystem  
  
import android.content.Context  
import android.content.Intent  
  
class SharedPrefManager private constructor(context: Context) {  
  
    //this method will checker whether user is already logged in or not  
    val isLoggedIn: Boolean  
        get() {  
            val sharedPreferences = ctx?.getSharedPreferences(SHARED_PREF_NAME, Context.MODE_PRIVATE)  
            return sharedPreferences?.getString(KEY_USERNAME, null) != null  
        }  
  
    //this method will give the logged in user  
    val user: User  
        get() {  
            val sharedPreferences = ctx?.getSharedPreferences(SHARED_PREF_NAME, Context.MODE_PRIVATE)  
            return User(  
                    sharedPreferences!!.getInt(KEY_ID, -1),  
                    sharedPreferences.getString(KEY_USERNAME, null),  
                    sharedPreferences.getString(KEY_EMAIL, null),  
                    sharedPreferences.getString(KEY_GENDER, null)  
            )  
        }  
  
    init {  
        ctx = context  
    }  
  
    //this method will store the user data in shared preferences  
    fun userLogin(user: User) {  
        val sharedPreferences = ctx?.getSharedPreferences(SHARED_PREF_NAME, Context.MODE_PRIVATE)  
        val editor = sharedPreferences?.edit()  
        editor?.putInt(KEY_ID, user.id)  
        editor?.putString(KEY_USERNAME, user.name)  
        editor?.putString(KEY_EMAIL, user.email)  
        editor?.putString(KEY_GENDER, user.gender)  
        editor?.apply()  
    }  
  
    //this method will logout the user  
    fun logout() {  
        val sharedPreferences = ctx?.getSharedPreferences(SHARED_PREF_NAME, Context.MODE_PRIVATE)  
        val editor = sharedPreferences?.edit()  
        editor?.clear()  
        editor?.apply()  
        ctx?.startActivity(Intent(ctx, LoginActivity::class.java))  
    }  
  
    companion object {  
  
        private val SHARED_PREF_NAME = "volleyregisterlogin"  
        private val KEY_USERNAME = "keyusername"  
        private val KEY_EMAIL = "keyemail"  
        private val KEY_GENDER = "keygender"  
        private val KEY_ID = "keyid"  
        private var mInstance: SharedPrefManager? = null  
        private var ctx: Context? = null  
        @Synchronized  
        fun getInstance(context: Context): SharedPrefManager {  
            if (mInstance == null) {  
                mInstance = SharedPrefManager(context)  
            }  
            return mInstance as SharedPrefManager  
        }  
    }  
}  

Now, in the MainActivity.kt class, we will display the user information if the user is logged-in otherwise, it redirects to LoginActivity.kt class. The onClick() method is used to log-out the user when clicking on the button.


MainActivity.kt


package example.javatpoint.com.kotlinvolleyregistrationloginsystem  
  
import android.support.v7.app.AppCompatActivity  
import android.os.Bundle  
import android.content.Intent  
import android.view.View  
import android.widget.Button  
import android.widget.TextView  
  
class MainActivity : AppCompatActivity(), View.OnClickListener {  
  
    internal lateinit var id: TextView  
    internal lateinit var userName: TextView  
    internal lateinit var userEmail: TextView  
    internal lateinit var gender: TextView  
    internal lateinit var btnLogout: Button  
    override fun onCreate(savedInstanceState: Bundle?) {  
        super.onCreate(savedInstanceState)  
        setContentView(R.layout.activity_main)  
        if (SharedPrefManager.getInstance(this).isLoggedIn) {  
            id = findViewById(R.id.textViewId)  
            userName = findViewById(R.id.textViewUsername)  
            userEmail = findViewById(R.id.textViewEmail)  
            gender = findViewById(R.id.textViewGender)  
            btnLogout = findViewById(R.id.buttonLogout)  
  
            val user = SharedPrefManager.getInstance(this).user  
  
            id.text = user.id.toString()  
            userEmail.text = user.email  
            gender.text = user.gender  
            userName.text = user.name  
  
            btnLogout.setOnClickListener(this)  
  
        } else {  
            val intent = Intent(this@MainActivity, LoginActivity::class.java)  
            startActivity(intent)  
            finish()  
        }  
    }  
  
    override fun onClick(view: View) {  
        if (view == btnLogout) {  
            SharedPrefManager.getInstance(applicationContext).logout()  
        }  
    }  
}  
package example.javatpoint.com.kotlinvolleyregistrationloginsystem  
  
import android.support.v7.app.AppCompatActivity  
import android.os.Bundle  
import android.content.Intent  
import android.view.View  
import android.widget.Button  
import android.widget.TextView  
  
class MainActivity : AppCompatActivity(), View.OnClickListener {  
  
    internal lateinit var id: TextView  
    internal lateinit var userName: TextView  
    internal lateinit var userEmail: TextView  
    internal lateinit var gender: TextView  
    internal lateinit var btnLogout: Button  
    override fun onCreate(savedInstanceState: Bundle?) {  
        super.onCreate(savedInstanceState)  
        setContentView(R.layout.activity_main)  
        if (SharedPrefManager.getInstance(this).isLoggedIn) {  
            id = findViewById(R.id.textViewId)  
            userName = findViewById(R.id.textViewUsername)  
            userEmail = findViewById(R.id.textViewEmail)  
            gender = findViewById(R.id.textViewGender)  
            btnLogout = findViewById(R.id.buttonLogout)  
  
            val user = SharedPrefManager.getInstance(this).user  
  
            id.text = user.id.toString()  
            userEmail.text = user.email  
            gender.text = user.gender  
            userName.text = user.name  
  
            btnLogout.setOnClickListener(this)  
  
        } else {  
            val intent = Intent(this@MainActivity, LoginActivity::class.java)  
            startActivity(intent)  
            finish()  
        }  
    }  
  
    override fun onClick(view: View) {  
        if (view == btnLogout) {  
            SharedPrefManager.getInstance(applicationContext).logout()  
        }  
    }  
}  

In the LoginActivity.kt class, we check that the user is already logged-in or not, if true then redirect to MainActivity.kt class otherwise, allow a user to log-in. StringRequest class of Volley library is used for network module. The object of StringRequest class takes the parameters of the type request method, URL, and the response.


LoginActivity.kt


package example.javatpoint.com.kotlinvolleyregistrationloginsystem  
  
import android.support.v7.app.AppCompatActivity  
import android.os.Bundle  
  
import android.content.Intent  
import android.text.TextUtils  
import android.view.View  
import android.widget.EditText  
import android.widget.ProgressBar  
import android.widget.Toast  
import com.android.volley.AuthFailureError  
import com.android.volley.Request  
import com.android.volley.Response  
import com.android.volley.toolbox.StringRequest  
import kotlinx.android.synthetic.main.activity_login.*  
import org.json.JSONException  
import org.json.JSONObject  
import java.util.HashMap  
  
class LoginActivity : AppCompatActivity() {  
    internal lateinit var etName: EditText  
    internal lateinit var etPassword: EditText  
    internal lateinit var progressBar: ProgressBar  
    override fun onCreate(savedInstanceState: Bundle?) {  
        super.onCreate(savedInstanceState)  
        setContentView(R.layout.activity_login)  
  
        if (SharedPrefManager.getInstance(this).isLoggedIn) {  
            finish()  
            startActivity(Intent(this, MainActivity::class.java))  
        }  
  
        progressBar = findViewById(R.id.progressBar)  
        etName = findViewById(R.id.etUserName)  
        etPassword = findViewById(R.id.etUserPassword)  
  
        //calling the method userLogin() for login the user  
         btnLogin.setOnClickListener(View.OnClickListener {  
            userLogin()  
        })  
  
        //if user presses on textview it call the activity RegisterActivity  
        tvRegister.setOnClickListener(View.OnClickListener {  
            finish()  
            startActivity(Intent(applicationContext, RegisterActivity::class.java))  
        })  
    }  
  
    private fun userLogin() {  
        //first getting the values  
        val username = etName.text.toString()  
        val password = etPassword.text.toString()  
        //validating inputs  
        if (TextUtils.isEmpty(username)) {  
            etName.error = "Please enter your username"  
            etName.requestFocus()  
            return  
        }  
  
        if (TextUtils.isEmpty(password)) {  
            etPassword.error = "Please enter your password"  
            etPassword.requestFocus()  
            return  
        }  
  
        //if everything is fine  
        val stringRequest = object : StringRequest(Request.Method.POST, URLs.URL_LOGIN,  
                Response.Listener { response ->  
                    progressBar.visibility = View.GONE  
  
                    try {  
                        //converting response to json object  
                        val obj = JSONObject(response)  
  
                        //if no error in response  
                        if (!obj.getBoolean("error")) {  
                            Toast.makeText(applicationContext, obj.getString("message"), Toast.LENGTH_SHORT).show()  
  
                            //getting the user from the response  
                            val userJson = obj.getJSONObject("user")  
  
                            //creating a new user object  
                            val user = User(  
                                    userJson.getInt("id"),  
                                    userJson.getString("username"),  
                                    userJson.getString("email"),  
                                    userJson.getString("gender")  
                            )  
  
                            //storing the user in shared preferences  
                            SharedPrefManager.getInstance(applicationContext).userLogin(user)  
                            //starting the MainActivity  
                            finish()  
                            startActivity(Intent(applicationContext, MainActivity::class.java))  
                        } else {  
                            Toast.makeText(applicationContext, obj.getString("message"), Toast.LENGTH_SHORT).show()  
                        }  
                    } catch (e: JSONException) {  
                        e.printStackTrace()  
                    }  
                },  
                Response.ErrorListener { error -> Toast.makeText(applicationContext, error.message, Toast.LENGTH_SHORT).show() }) {  
            @Throws(AuthFailureError::class)  
            override fun getParams(): Map< String, String> {  
                val params = HashMap< String, String>()  
                params["username"] = username  
                params["password"] = password  
                return params  
            }  
        }  
  
        VolleySingleton.getInstance(this).addToRequestQueue(stringRequest)  
    }  
}  
package example.javatpoint.com.kotlinvolleyregistrationloginsystem  
  
import android.support.v7.app.AppCompatActivity  
import android.os.Bundle  
  
import android.content.Intent  
import android.text.TextUtils  
import android.view.View  
import android.widget.EditText  
import android.widget.ProgressBar  
import android.widget.Toast  
import com.android.volley.AuthFailureError  
import com.android.volley.Request  
import com.android.volley.Response  
import com.android.volley.toolbox.StringRequest  
import kotlinx.android.synthetic.main.activity_login.*  
import org.json.JSONException  
import org.json.JSONObject  
import java.util.HashMap  
  
class LoginActivity : AppCompatActivity() {  
    internal lateinit var etName: EditText  
    internal lateinit var etPassword: EditText  
    internal lateinit var progressBar: ProgressBar  
    override fun onCreate(savedInstanceState: Bundle?) {  
        super.onCreate(savedInstanceState)  
        setContentView(R.layout.activity_login)  
  
        if (SharedPrefManager.getInstance(this).isLoggedIn) {  
            finish()  
            startActivity(Intent(this, MainActivity::class.java))  
        }  
  
        progressBar = findViewById(R.id.progressBar)  
        etName = findViewById(R.id.etUserName)  
        etPassword = findViewById(R.id.etUserPassword)  
  
        //calling the method userLogin() for login the user  
         btnLogin.setOnClickListener(View.OnClickListener {  
            userLogin()  
        })  
  
        //if user presses on textview it call the activity RegisterActivity  
        tvRegister.setOnClickListener(View.OnClickListener {  
            finish()  
            startActivity(Intent(applicationContext, RegisterActivity::class.java))  
        })  
    }  
  
    private fun userLogin() {  
        //first getting the values  
        val username = etName.text.toString()  
        val password = etPassword.text.toString()  
        //validating inputs  
        if (TextUtils.isEmpty(username)) {  
            etName.error = "Please enter your username"  
            etName.requestFocus()  
            return  
        }  
  
        if (TextUtils.isEmpty(password)) {  
            etPassword.error = "Please enter your password"  
            etPassword.requestFocus()  
            return  
        }  
  
        //if everything is fine  
        val stringRequest = object : StringRequest(Request.Method.POST, URLs.URL_LOGIN,  
                Response.Listener { response ->  
                    progressBar.visibility = View.GONE  
  
                    try {  
                        //converting response to json object  
                        val obj = JSONObject(response)  
  
                        //if no error in response  
                        if (!obj.getBoolean("error")) {  
                            Toast.makeText(applicationContext, obj.getString("message"), Toast.LENGTH_SHORT).show()  
  
                            //getting the user from the response  
                            val userJson = obj.getJSONObject("user")  
  
                            //creating a new user object  
                            val user = User(  
                                    userJson.getInt("id"),  
                                    userJson.getString("username"),  
                                    userJson.getString("email"),  
                                    userJson.getString("gender")  
                            )  
  
                            //storing the user in shared preferences  
                            SharedPrefManager.getInstance(applicationContext).userLogin(user)  
                            //starting the MainActivity  
                            finish()  
                            startActivity(Intent(applicationContext, MainActivity::class.java))  
                        } else {  
                            Toast.makeText(applicationContext, obj.getString("message"), Toast.LENGTH_SHORT).show()  
                        }  
                    } catch (e: JSONException) {  
                        e.printStackTrace()  
                    }  
                },  
                Response.ErrorListener { error -> Toast.makeText(applicationContext, error.message, Toast.LENGTH_SHORT).show() }) {  
            @Throws(AuthFailureError::class)  
            override fun getParams(): Map< String, String> {  
                val params = HashMap< String, String>()  
                params["username"] = username  
                params["password"] = password  
                return params  
            }  
        }  
  
        VolleySingleton.getInstance(this).addToRequestQueue(stringRequest)  
    }  
}  

The RegisterActivity.kt class is used to register the user. This class initially checks the user log-in, if true then redirect to MainActivity.kt class otherwise, allow user for registration.
Similar to LoginActivity.kt class, we use the StringRequest class of Volley library for network connection and pass the parameters of the type request method, URL, and the response. The Response.Listener handles the response generated by the server.


RegisterActivity.kt


package example.javatpoint.com.kotlinvolleyregistrationloginsystem  
  
import android.support.v7.app.AppCompatActivity  
import android.os.Bundle  
import android.content.Intent  
import android.text.TextUtils  
import android.view.View  
import android.widget.EditText  
import android.widget.ProgressBar  
import android.widget.RadioButton  
import android.widget.RadioGroup  
import android.widget.Toast  
import com.android.volley.AuthFailureError  
import com.android.volley.Request  
import com.android.volley.Response  
import com.android.volley.toolbox.StringRequest  
import kotlinx.android.synthetic.main.activity_register.*  
import org.json.JSONException  
import org.json.JSONObject  
import java.util.HashMap  
  
class RegisterActivity : AppCompatActivity() {  
    internal lateinit var editTextUsername: EditText  
    internal lateinit var editTextEmail: EditText  
    internal lateinit var editTextPassword: EditText  
    internal lateinit var radioGroupGender: RadioGroup  
    internal lateinit var progressBar: ProgressBar  
    override fun onCreate(savedInstanceState: Bundle?) {  
        super.onCreate(savedInstanceState)  
        setContentView(R.layout.activity_register)  
        progressBar = findViewById(R.id.progressBar)  
  
        //if the user is already logged in we will directly start the MainActivity (profile) activity  
        if (SharedPrefManager.getInstance(this).isLoggedIn) {  
            finish()  
            startActivity(Intent(this, MainActivity::class.java))  
            return  
        }  
  
        editTextUsername = findViewById(R.id.editTextUsername)  
        editTextEmail = findViewById(R.id.editTextEmail)  
        editTextPassword = findViewById(R.id.editTextPassword)  
        radioGroupGender = findViewById(R.id.radioGender)  
  
        buttonRegister.setOnClickListener(View.OnClickListener {  
            //if user pressed on button register  
            //here we will register the user to server  
            registerUser()  
        })  
  
        textViewLogin.setOnClickListener(View.OnClickListener {  
            finish()  
            startActivity(Intent(this@RegisterActivity, LoginActivity::class.java))  
        })  
    }  
  
    private fun registerUser() {  
        val username = editTextUsername.text.toString().trim { it <= ' ' }  
        val email = editTextEmail.text.toString().trim { it <= ' ' }  
        val password = editTextPassword.text.toString().trim { it <= ' ' }  
  
        val gender = (findViewById< View>(radioGroupGender.checkedRadioButtonId) as RadioButton).text.toString()  
  
        //first we will do the validations  
        if (TextUtils.isEmpty(username)) {  
            editTextUsername.error = "Please enter username"  
            editTextUsername.requestFocus()  
            return  
        }  
  
        if (TextUtils.isEmpty(email)) {  
            editTextEmail.error = "Please enter your email"  
            editTextEmail.requestFocus()  
            return  
        }  
  
        if (!android.util.Patterns.EMAIL_ADDRESS.matcher(email).matches()) {  
            editTextEmail.error = "Enter a valid email"  
            editTextEmail.requestFocus()  
            return  
        }  
  
        if (TextUtils.isEmpty(password)) {  
            editTextPassword.error = "Enter a password"  
            editTextPassword.requestFocus()  
            return  
        }  
  
        val stringRequest = object : StringRequest(Request.Method.POST, URLs.URL_REGISTER,  
                Response.Listener { response ->  
                    progressBar.visibility = View.GONE  
  
                    try {  
                        //converting response to json object  
                        val obj = JSONObject(response)  
                        //if no error in response  
                        if (!obj.getBoolean("error")) {  
                            Toast.makeText(applicationContext, obj.getString("message"), Toast.LENGTH_SHORT).show()  
  
                            //getting the user from the response  
                            val userJson = obj.getJSONObject("user")  
  
                            //creating a new user object  
                            val user = User(  
                                    userJson.getInt("id"),  
                                    userJson.getString("username"),  
                                    userJson.getString("email"),  
                                    userJson.getString("gender")  
                            )  
  
                            //storing the user in shared preferences  
                            SharedPrefManager.getInstance(applicationContext).userLogin(user)  
  
                            //starting the MainActivity activity  
                            finish()  
                            startActivity(Intent(applicationContext, MainActivity::class.java))  
                        } else {  
                            Toast.makeText(applicationContext, obj.getString("message"), Toast.LENGTH_SHORT).show()  
                        }  
                    } catch (e: JSONException) {  
                        e.printStackTrace()  
                    }  
                },  
                Response.ErrorListener { error -> Toast.makeText(applicationContext, error.message, Toast.LENGTH_SHORT).show() }) {  
            @Throws(AuthFailureError::class)  
            override fun getParams(): Map< String, String> {  
                val params = HashMap< String, String>()  
                params["username"] = username  
                params["email"] = email  
                params["password"] = password  
                params["gender"] = gender  
                return params  
            }  
        }  
  
        VolleySingleton.getInstance(this).addToRequestQueue(stringRequest)  
    }  
}  
package example.javatpoint.com.kotlinvolleyregistrationloginsystem  
  
import android.support.v7.app.AppCompatActivity  
import android.os.Bundle  
import android.content.Intent  
import android.text.TextUtils  
import android.view.View  
import android.widget.EditText  
import android.widget.ProgressBar  
import android.widget.RadioButton  
import android.widget.RadioGroup  
import android.widget.Toast  
import com.android.volley.AuthFailureError  
import com.android.volley.Request  
import com.android.volley.Response  
import com.android.volley.toolbox.StringRequest  
import kotlinx.android.synthetic.main.activity_register.*  
import org.json.JSONException  
import org.json.JSONObject  
import java.util.HashMap  
  
class RegisterActivity : AppCompatActivity() {  
    internal lateinit var editTextUsername: EditText  
    internal lateinit var editTextEmail: EditText  
    internal lateinit var editTextPassword: EditText  
    internal lateinit var radioGroupGender: RadioGroup  
    internal lateinit var progressBar: ProgressBar  
    override fun onCreate(savedInstanceState: Bundle?) {  
        super.onCreate(savedInstanceState)  
        setContentView(R.layout.activity_register)  
        progressBar = findViewById(R.id.progressBar)  
  
        //if the user is already logged in we will directly start the MainActivity (profile) activity  
        if (SharedPrefManager.getInstance(this).isLoggedIn) {  
            finish()  
            startActivity(Intent(this, MainActivity::class.java))  
            return  
        }  
  
        editTextUsername = findViewById(R.id.editTextUsername)  
        editTextEmail = findViewById(R.id.editTextEmail)  
        editTextPassword = findViewById(R.id.editTextPassword)  
        radioGroupGender = findViewById(R.id.radioGender)  
  
        buttonRegister.setOnClickListener(View.OnClickListener {  
            //if user pressed on button register  
            //here we will register the user to server  
            registerUser()  
        })  
  
        textViewLogin.setOnClickListener(View.OnClickListener {  
            finish()  
            startActivity(Intent(this@RegisterActivity, LoginActivity::class.java))  
        })  
    }  
  
    private fun registerUser() {  
        val username = editTextUsername.text.toString().trim { it <= ' ' }  
        val email = editTextEmail.text.toString().trim { it <= ' ' }  
        val password = editTextPassword.text.toString().trim { it <= ' ' }  
  
        val gender = (findViewById< View>(radioGroupGender.checkedRadioButtonId) as RadioButton).text.toString()  
  
        //first we will do the validations  
        if (TextUtils.isEmpty(username)) {  
            editTextUsername.error = "Please enter username"  
            editTextUsername.requestFocus()  
            return  
        }  
  
        if (TextUtils.isEmpty(email)) {  
            editTextEmail.error = "Please enter your email"  
            editTextEmail.requestFocus()  
            return  
        }  
  
        if (!android.util.Patterns.EMAIL_ADDRESS.matcher(email).matches()) {  
            editTextEmail.error = "Enter a valid email"  
            editTextEmail.requestFocus()  
            return  
        }  
  
        if (TextUtils.isEmpty(password)) {  
            editTextPassword.error = "Enter a password"  
            editTextPassword.requestFocus()  
            return  
        }  
  
        val stringRequest = object : StringRequest(Request.Method.POST, URLs.URL_REGISTER,  
                Response.Listener { response ->  
                    progressBar.visibility = View.GONE  
  
                    try {  
                        //converting response to json object  
                        val obj = JSONObject(response)  
                        //if no error in response  
                        if (!obj.getBoolean("error")) {  
                            Toast.makeText(applicationContext, obj.getString("message"), Toast.LENGTH_SHORT).show()  
  
                            //getting the user from the response  
                            val userJson = obj.getJSONObject("user")  
  
                            //creating a new user object  
                            val user = User(  
                                    userJson.getInt("id"),  
                                    userJson.getString("username"),  
                                    userJson.getString("email"),  
                                    userJson.getString("gender")  
                            )  
  
                            //storing the user in shared preferences  
                            SharedPrefManager.getInstance(applicationContext).userLogin(user)  
  
                            //starting the MainActivity activity  
                            finish()  
                            startActivity(Intent(applicationContext, MainActivity::class.java))  
                        } else {  
                            Toast.makeText(applicationContext, obj.getString("message"), Toast.LENGTH_SHORT).show()  
                        }  
                    } catch (e: JSONException) {  
                        e.printStackTrace()  
                    }  
                },  
                Response.ErrorListener { error -> Toast.makeText(applicationContext, error.message, Toast.LENGTH_SHORT).show() }) {  
            @Throws(AuthFailureError::class)  
            override fun getParams(): Map< String, String> {  
                val params = HashMap< String, String>()  
                params["username"] = username  
                params["email"] = email  
                params["password"] = password  
                params["gender"] = gender  
                return params  
            }  
        }  
  
        VolleySingleton.getInstance(this).addToRequestQueue(stringRequest)  
    }  
}  

AndroidManifest.xml


Add the following permission in AndroidManifest.xml file


< uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />  
< uses-permission android:name="android.permission.INTERNET" />  
< uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />  
< uses-permission android:name="android.permission.INTERNET" /> 

Output:







Hi I am Pluto.