Firebase es un producto famoso de Google que muchos desarrolladores utilizan para agregar funciones de back-end para su sitio web y aplicaciones. Firebase hará que su trabajo sea realmente más fácil para la base de datos de back-end y el manejo de la base de datos. En este artículo, veremos la implementación de Firebase Realtime Database en Android. En este artículo, agregaremos una autenticación de correo electrónico y contraseña dentro de nuestra aplicación y, junto con eso, realizaremos las operaciones CRUD (Crear, Leer, Actualizar y Eliminar) dentro de nuestra aplicación utilizando Firebase Realtime Database.
¿Qué vamos a construir en este artículo?
En este artículo, crearemos una aplicación de Android simple en la que primero autenticaremos al usuario con su correo electrónico y contraseña. Después de eso, mostraremos la lista de cursos que están disponibles en Geeks for Geeks en la vista del reciclador. Podremos realizar operaciones CRUD en estos cursos. A continuación se muestra el video en el que veremos lo que vamos a construir en este artículo.
Implementación paso a paso
Paso 1: Crear un nuevo Proyecto
Para crear un nuevo proyecto en Android Studio, consulte Cómo crear/iniciar un nuevo proyecto en Android Studio . Tenga en cuenta que seleccione Java como lenguaje de programación.
Paso 2: conecta tu aplicación a Firebase
Después de crear un nuevo proyecto, vaya a la opción Herramientas en la barra superior. Dentro de eso, haga clic en Firebase. Después de hacer clic en Firebase, puede ver la columna de la derecha que se menciona a continuación en la captura de pantalla.
Dentro de esa columna, navegue hasta Firebase Realtime Database. Haga clic en esa opción y verá dos opciones en Conectar la aplicación a Firebase y Agregar Firebase Realtime Database a su aplicación. Haga clic en Conectar ahora y su aplicación se conectará a Firebase. Después de eso, haga clic en la segunda opción y ahora su aplicación está conectada a Firebase.
Después de conectar su aplicación a Firebase, verá la siguiente pantalla.
Después de eso, verifique que la dependencia de la base de datos Firebase Realtime se haya agregado a nuestro archivo Gradle. Ahora navegue a la aplicación> Gradle Scripts y dentro de ese archivo verifique si la dependencia a continuación se agrega o no. Si la dependencia a continuación no se agrega en su archivo build.gradle . Agregue la siguiente dependencia en la sección de dependencias. A continuación se muestra la sección de dependencias completa en la que hay dependencias para la autenticación, así como la base de datos.
dependencies { implementation 'androidx.appcompat:appcompat:1.3.0' implementation 'com.google.android.material:material:1.4.0' // dependency for picasso for loading image from url implementation 'com.squareup.picasso:picasso:2.71828' implementation 'androidx.constraintlayout:constraintlayout:2.0.4' // dependency for firebase database. implementation 'com.google.firebase:firebase-database:20.0.0' implementation platform('com.google.firebase:firebase-bom:28.2.1') // dependency for firebase authentication. implementation 'com.google.firebase:firebase-auth' testImplementation 'junit:junit:4.+' androidTestImplementation 'androidx.test.ext:junit:1.1.3' androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0' }
Después de agregar esta dependencia, sincronice su proyecto y ahora estamos listos para crear nuestra aplicación. Si desea obtener más información sobre cómo conectar su aplicación a Firebase. Consulte este artículo para obtener detalles sobre cómo agregar Firebase a la aplicación de Android.
Paso 3: Crear 4 actividades vacías diferentes
Vaya a la aplicación > Nombre del paquete de su aplicación > Haga clic con el botón derecho en él > Nuevo > Actividad > Seleccione Actividad vacía y cree una nueva actividad. A continuación se muestra el nombre de las cuatro actividades diferentes que tenemos que pasar al crear nuevas actividades.
- AddCourseActivity : esta actividad la usaremos para agregar un nuevo curso.
- EditCourseActivity : esta actividad se utilizará para editar nuestro curso y eliminarlo.
- LoginActivity : esta actividad se utilizará con fines de inicio de sesión para el inicio de sesión de usuario existente.
- RegisterActivity : Esta actividad se utiliza para el registro de nuevos Usuarios.
El archivo MainActivity.java ya estará presente en el que mostraremos la lista de cursos en RecyclerView .
Paso 4: trabajar con el archivo AndroidManifest.xml
Vaya a aplicación > archivo AndroidManifest.xml y agréguele permisos de Internet. A continuación se muestra el código completo del archivo AndroidManifest.xml. Dentro de este archivo, también estamos cambiando nuestra actividad de iniciador a Actividad de inicio de sesión. Se agregan comentarios en el código para conocer con más detalle.
XML
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.gtappdevelopers.firebasecrudapp"> <!--permissions for internet--> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/Theme.FirebaseCrudApp"> <activity android:name=".EditCourseActivity" android:label="Edit Course" /> <activity android:name=".AddCourseActivity" android:label="Add Course" /> <activity android:name=".RegisterActivity" android:label="Register" /> <!--login activity is set as launcher activity--> <activity android:name=".LoginActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android:name=".MainActivity" /> </application> </manifest>
Paso 5: Actualización del archivo colors.xml
Vaya a la aplicación > res > valores > colores.xml y agréguele los siguientes colores.
XML
<?xml version="1.0" encoding="utf-8"?> <resources xmlns:tools="http://schemas.android.com/tools"> <color name="purple_200">#296D98</color> <color name="purple_500">#296D98</color> <color name="purple_700">#296D98</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="black_shade_1">#0e2433</color> <color name="black_shade_2">#1C4966</color> <color name="black_shade_3">#22252D</color> <color name="mtrl_textinput_default_box_stroke_color" tools:override="true">#296D98</color> <color name="light_blue_shade_1">#296D98</color> <color name="gray">#424242</color> <color name="yellow">#ffa500</color> <color name="dark_blue_shade">#0D2162</color> <color name="dark_blue_shade_2">#17388E</color> <color name="light_blue_shade">#12B2E6</color> </resources>
Paso 6: Actualizar nuestro archivo themes.xml
Vaya a la aplicación > res > valores > themes.xml y agréguele el siguiente código.
XML
<resources xmlns:tools="http://schemas.android.com/tools"> <!-- Base application theme. --> <style name="Theme.FirebaseCrudApp" parent="Theme.MaterialComponents.DayNight.DarkActionBar"> <!-- Primary brand color. --> <item name="colorPrimary">@color/purple_500</item> <item name="colorPrimaryVariant">@color/purple_700</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" tools:targetApi="l">?attr/colorPrimaryVariant</item> <!-- Customize your theme here. --> </style> <style name="AppBottomSheetDialogTheme" parent="Theme.Design.Light.BottomSheetDialog"> <item name="bottomSheetStyle">@style/AppModalStyle</item> </style> <style name="BottomSheetDialogTheme" parent="Theme.Design.Light.BottomSheetDialog"> <item name="bottomSheetStyle">@style/BottomSheetStyle</item> </style> <style name="BottomSheetStyle" parent="Widget.Design.BottomSheet.Modal"> <item name="android:background">@android:color/transparent</item> </style> <style name="AppModalStyle" parent="Widget.Design.BottomSheet.Modal"> <item name="android:background">@drawable/rounded_drawable</item> </style> <style name="LoginTextInputLayoutStyle" parent="Widget.MaterialComponents.TextInputLayout.OutlinedBox.Dense"> <item name="boxStrokeColor">#296D98</item> <item name="boxStrokeWidth">1dp</item> </style> </resources>
Paso 7: crear un fondo personalizado para nuestro botón y un fondo de barra de progreso personalizado
Navegue a la aplicación> res> dibujable> Haga clic con el botón derecho en él> Nuevo archivo de recursos dibujables y asígnele el nombre button_back y agregue el código a continuación. Se agregan comentarios en el código para conocer en detalle.
XML
<?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle"> <!--for specifying corner radius--> <corners android:radius="20dp" /> <!-- for specifying solid color--> <solid android:color="@color/black_shade_1" /> </shape>
Navegue a la aplicación> res> dibujable> Haga clic con el botón derecho en él> Nuevo archivo de recursos dibujables y asígnele el nombre progreso_retroceso y agregue el código a continuación. Se agregan comentarios en el código para conocer en detalle.
XML
<?xml version="1.0" encoding="utf-8"?> <rotate xmlns:android="http://schemas.android.com/apk/res/android" android:fromDegrees="0" android:pivotX="50%" android:pivotY="50%" android:toDegrees="360"> <!--shape tag is used to build a shape in XML--> <shape android:innerRadiusRatio="3" android:shape="ring" android:thicknessRatio="8" android:useLevel="false"> <!--set the size of the shape--> <size android:width="76dip" android:height="76dip" /> <!--set the color gradients of the shape--> <gradient android:angle="0" android:endColor="#00ffffff" android:startColor="@color/purple_200" android:type="sweep" android:useLevel="false" /> </shape> </rotate>
Paso 8: trabajar con el archivo activity_register.xml
Vaya a la aplicación > res > activity_register.xml y agréguele el siguiente código. Se agregan comentarios en el código para conocer con más detalle.
XML
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout 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="@color/black_shade_1" tools:context=".RegisterActivity"> <!--edit text for user name--> <com.google.android.material.textfield.TextInputLayout android:id="@+id/idTILUserName" style="@style/LoginTextInputLayoutStyle" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginStart="20dp" android:layout_marginTop="140dp" android:layout_marginEnd="20dp" android:hint="Enter User Name" android:padding="5dp" android:textColorHint="@color/white" app:hintTextColor="@color/white"> <com.google.android.material.textfield.TextInputEditText android:id="@+id/idEdtUserName" android:layout_width="match_parent" android:layout_height="match_parent" android:ems="10" android:importantForAutofill="no" android:inputType="textEmailAddress" android:textColor="@color/white" android:textColorHint="@color/white" android:textSize="14sp" /> </com.google.android.material.textfield.TextInputLayout> <!--edit text for user password--> <com.google.android.material.textfield.TextInputLayout android:id="@+id/idTILPassword" style="@style/LoginTextInputLayoutStyle" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_below="@id/idTILUserName" android:layout_marginStart="20dp" android:layout_marginTop="20dp" android:layout_marginEnd="20dp" android:hint="Enter Your Password" android:padding="5dp" android:textColorHint="@color/white" app:hintTextColor="@color/white"> <com.google.android.material.textfield.TextInputEditText android:id="@+id/idEdtPassword" android:layout_width="match_parent" android:layout_height="match_parent" android:ems="10" android:importantForAutofill="no" android:inputType="textPassword" android:textColor="@color/white" android:textColorHint="@color/white" android:textSize="14sp" /> </com.google.android.material.textfield.TextInputLayout> <!--edit text for confirmation of user password--> <com.google.android.material.textfield.TextInputLayout android:id="@+id/idTILConfirmPassword" style="@style/LoginTextInputLayoutStyle" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_below="@id/idTILPassword" android:layout_marginStart="20dp" android:layout_marginTop="20dp" android:layout_marginEnd="20dp" android:hint="Confirm Your Password" android:padding="5dp" android:textColorHint="@color/white" app:hintTextColor="@color/white"> <com.google.android.material.textfield.TextInputEditText android:id="@+id/idEdtConfirmPassword" android:layout_width="match_parent" android:layout_height="match_parent" android:ems="10" android:importantForAutofill="no" android:inputType="textPassword" android:textColor="@color/white" android:textColorHint="@color/white" android:textSize="14sp" /> </com.google.android.material.textfield.TextInputLayout> <!--button for creating user account.--> <Button android:id="@+id/idBtnRegister" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_below="@id/idTILConfirmPassword" android:layout_marginStart="25dp" android:layout_marginTop="40dp" android:layout_marginEnd="25dp" android:background="@drawable/button_back" android:text="Register" android:textAllCaps="false" /> <!--text view for displaying a text on clicking we will open a login page--> <TextView android:id="@+id/idTVLoginUser" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_below="@id/idBtnRegister" android:layout_marginTop="40dp" android:gravity="center" android:padding="10dp" android:text="Already a User ? Login Here" android:textAlignment="center" android:textAllCaps="false" android:textColor="@color/white" android:textSize="18sp" /> <!--progress bar as a loading indicator--> <ProgressBar android:id="@+id/idPBLoading" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerInParent="true" android:indeterminate="true" android:indeterminateDrawable="@drawable/progress_back" android:visibility="gone" /> </RelativeLayout>
Paso 9: trabajar con el archivo RegisterActivity.java
Vaya a la aplicación > java > el nombre del paquete de su aplicación > el archivo RegisterActivity.java y agréguele el siguiente código. Se agregan comentarios en el código para conocer con más detalle.
Java
package com.gtappdevelopers.firebasecrudapp; import android.content.Intent; import android.os.Bundle; import android.text.TextUtils; import android.view.View; import android.widget.Button; import android.widget.ProgressBar; import android.widget.TextView; import android.widget.Toast; import androidx.annotation.NonNull; import androidx.appcompat.app.AppCompatActivity; import com.google.android.gms.tasks.OnCompleteListener; import com.google.android.gms.tasks.Task; import com.google.android.material.textfield.TextInputEditText; import com.google.firebase.auth.AuthResult; import com.google.firebase.auth.FirebaseAuth; public class RegisterActivity extends AppCompatActivity { // creating variables for edit text and textview, // firebase auth, button and progress bar. private TextInputEditText userNameEdt, passwordEdt, confirmPwdEdt; private TextView loginTV; private Button registerBtn; private FirebaseAuth mAuth; private ProgressBar loadingPB; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_register); // initializing all our variables. userNameEdt = findViewById(R.id.idEdtUserName); passwordEdt = findViewById(R.id.idEdtPassword); loadingPB = findViewById(R.id.idPBLoading); confirmPwdEdt = findViewById(R.id.idEdtConfirmPassword); loginTV = findViewById(R.id.idTVLoginUser); registerBtn = findViewById(R.id.idBtnRegister); mAuth = FirebaseAuth.getInstance(); // adding on click for login tv. loginTV.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // opening a login activity on clicking login text. Intent i = new Intent(RegisterActivity.this, LoginActivity.class); startActivity(i); } }); // adding click listener for register button. registerBtn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // hiding our progress bar. loadingPB.setVisibility(View.VISIBLE); // getting data fro =m our edit text. String userName = userNameEdt.getText().toString(); String pwd = passwordEdt.getText().toString(); String cnfPwd = confirmPwdEdt.getText().toString(); // checking if the password and confirm password is equal or not. if (!pwd.equals(cnfPwd)) { Toast.makeText(RegisterActivity.this, "Please check both having same password..", Toast.LENGTH_SHORT).show(); } else if (TextUtils.isEmpty(userName) && TextUtils.isEmpty(pwd) && TextUtils.isEmpty(cnfPwd)) { // checking if the text fields are empty or not. Toast.makeText(RegisterActivity.this, "Please enter your credentials..", Toast.LENGTH_SHORT).show(); } else { // on below line we are creating a new user by passing email and password. mAuth.createUserWithEmailAndPassword(userName, pwd).addOnCompleteListener(new OnCompleteListener<AuthResult>() { @Override public void onComplete(@NonNull Task<AuthResult> task) { // on below line we are checking if the task is success or not. if (task.isSuccessful()) { // in on success method we are hiding our progress bar and opening a login activity. loadingPB.setVisibility(View.GONE); Toast.makeText(RegisterActivity.this, "User Registered..", Toast.LENGTH_SHORT).show(); Intent i = new Intent(RegisterActivity.this, LoginActivity.class); startActivity(i); finish(); } else { // in else condition we are displaying a failure toast message. loadingPB.setVisibility(View.GONE); Toast.makeText(RegisterActivity.this, "Fail to register user..", Toast.LENGTH_SHORT).show(); } } }); } } }); } }
Paso 10: trabajar con el archivo activity_login.xml
Vaya a la aplicación > res > activity_login.xml y agréguele el siguiente código. Se agregan comentarios en el código para conocer con más detalle.
XML
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout 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="@color/black_shade_1" tools:context=".LoginActivity"> <!--edit text for user name--> <com.google.android.material.textfield.TextInputLayout android:id="@+id/idTILUserName" style="@style/LoginTextInputLayoutStyle" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginStart="20dp" android:layout_marginTop="140dp" android:layout_marginEnd="20dp" android:hint="Enter User Name" android:padding="5dp" android:textColorHint="@color/white" app:hintTextColor="@color/white"> <com.google.android.material.textfield.TextInputEditText android:id="@+id/idEdtUserName" android:layout_width="match_parent" android:layout_height="match_parent" android:ems="10" android:importantForAutofill="no" android:inputType="textEmailAddress" android:textColor="@color/white" android:textColorHint="@color/white" android:textSize="14sp" /> </com.google.android.material.textfield.TextInputLayout> <!--edit text for password--> <com.google.android.material.textfield.TextInputLayout android:id="@+id/idTILPassword" style="@style/LoginTextInputLayoutStyle" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_below="@id/idTILUserName" android:layout_marginStart="20dp" android:layout_marginTop="40dp" android:layout_marginEnd="20dp" android:hint="Enter your Password" android:padding="5dp" android:textColorHint="@color/white" app:hintTextColor="@color/white"> <com.google.android.material.textfield.TextInputEditText android:id="@+id/idEdtPassword" android:layout_width="match_parent" android:layout_height="match_parent" android:ems="10" android:importantForAutofill="no" android:inputType="textPassword" android:textColor="@color/white" android:textColorHint="@color/white" android:textSize="14sp" /> </com.google.android.material.textfield.TextInputLayout> <!--button for login--> <Button android:id="@+id/idBtnLogin" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_below="@id/idTILPassword" android:layout_marginStart="25dp" android:layout_marginTop="40dp" android:layout_marginEnd="25dp" android:background="@drawable/button_back" android:text="Login" android:textAllCaps="false" /> <!--text view for creating a new account--> <TextView android:id="@+id/idTVNewUser" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_below="@id/idBtnLogin" android:layout_marginTop="40dp" android:gravity="center" android:padding="10dp" android:text="New User ? Register Here" android:textAlignment="center" android:textAllCaps="false" android:textColor="@color/white" android:textSize="18sp" /> <!--progress-bar for loading indicator--> <ProgressBar android:id="@+id/idPBLoading" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@id/idTVNewUser" android:layout_centerHorizontal="true" android:layout_marginTop="10dp" android:indeterminate="true" android:indeterminateDrawable="@drawable/progress_back" android:visibility="gone" /> </RelativeLayout>
Paso 11: trabajar con el archivo LoginActivity.java
Vaya a la aplicación > java > el nombre del paquete de su aplicación > archivo LoginActivity.java y agréguele el siguiente código. Se agregan comentarios en el código para conocer con más detalle.
Java
package com.gtappdevelopers.firebasecrudapp; import android.content.Intent; import android.os.Bundle; import android.text.TextUtils; import android.view.View; import android.widget.Button; import android.widget.ProgressBar; import android.widget.TextView; import android.widget.Toast; import androidx.annotation.NonNull; import androidx.appcompat.app.AppCompatActivity; import com.google.android.gms.tasks.OnCompleteListener; import com.google.android.gms.tasks.Task; import com.google.android.material.textfield.TextInputEditText; import com.google.firebase.auth.AuthResult; import com.google.firebase.auth.FirebaseAuth; import com.google.firebase.auth.FirebaseUser; public class LoginActivity extends AppCompatActivity { // creating variable for edit text, textview, // button, progress bar and firebase auth. private TextInputEditText userNameEdt, passwordEdt; private Button loginBtn; private TextView newUserTV; private FirebaseAuth mAuth; private ProgressBar loadingPB; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_login); // initializing all our variables. userNameEdt = findViewById(R.id.idEdtUserName); passwordEdt = findViewById(R.id.idEdtPassword); loginBtn = findViewById(R.id.idBtnLogin); newUserTV = findViewById(R.id.idTVNewUser); mAuth = FirebaseAuth.getInstance(); loadingPB = findViewById(R.id.idPBLoading); // adding click listener for our new user tv. newUserTV.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // on below line opening a login activity. Intent i = new Intent(LoginActivity.this, RegisterActivity.class); startActivity(i); } }); // adding on click listener for our login button. loginBtn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // hiding our progress bar. loadingPB.setVisibility(View.VISIBLE); // getting data from our edit text on below line. String email = userNameEdt.getText().toString(); String password = passwordEdt.getText().toString(); // on below line validating the text input. if (TextUtils.isEmpty(email) && TextUtils.isEmpty(password)) { Toast.makeText(LoginActivity.this, "Please enter your credentials..", Toast.LENGTH_SHORT).show(); return; } // on below line we are calling a sign in method and passing email and password to it. mAuth.signInWithEmailAndPassword(email, password).addOnCompleteListener(new OnCompleteListener<AuthResult>() { @Override public void onComplete(@NonNull Task<AuthResult> task) { // on below line we are checking if the task is success or not. if (task.isSuccessful()) { // on below line we are hiding our progress bar. loadingPB.setVisibility(View.GONE); Toast.makeText(LoginActivity.this, "Login Successful..", Toast.LENGTH_SHORT).show(); // on below line we are opening our mainactivity. Intent i = new Intent(LoginActivity.this, MainActivity.class); startActivity(i); finish(); } else { // hiding our progress bar and displaying a toast message. loadingPB.setVisibility(View.GONE); Toast.makeText(LoginActivity.this, "Please enter valid user credentials..", Toast.LENGTH_SHORT).show(); } } }); } }); } @Override protected void onStart() { super.onStart(); // in on start method checking if // the user is already sign in. FirebaseUser user = mAuth.getCurrentUser(); if (user != null) { // if the user is not null then we are // opening a main activity on below line. Intent i = new Intent(LoginActivity.this, MainActivity.class); startActivity(i); this.finish(); } } }
Paso 12: crear una clase Modal para que nuestros datos se muestren dentro de nuestro RecyclerView
Navegue a la aplicación > java > el nombre del paquete de su aplicación > haga clic con el botón derecho en él > Nuevo > clase Java y asígnele el nombre CourseRVModal y agréguele el siguiente código. Se agregan comentarios en el código para conocer con más detalle.
Java
package com.gtappdevelopers.firebasecrudapp; import android.os.Parcel; import android.os.Parcelable; public class CourseRVModal implements Parcelable { // creating variables for our different fields. private String courseName; private String courseDescription; private String coursePrice; private String bestSuitedFor; private String courseImg; private String courseLink; private String courseId; public String getCourseId() { return courseId; } public void setCourseId(String courseId) { this.courseId = courseId; } // creating an empty constructor. public CourseRVModal() { } protected CourseRVModal(Parcel in) { courseName = in.readString(); courseId = in.readString(); courseDescription = in.readString(); coursePrice = in.readString(); bestSuitedFor = in.readString(); courseImg = in.readString(); courseLink = in.readString(); } public static final Creator<CourseRVModal> CREATOR = new Creator<CourseRVModal>() { @Override public CourseRVModal createFromParcel(Parcel in) { return new CourseRVModal(in); } @Override public CourseRVModal[] newArray(int size) { return new CourseRVModal[size]; } }; // creating getter and setter methods. public String getCourseName() { return courseName; } public void setCourseName(String courseName) { this.courseName = courseName; } public String getCourseDescription() { return courseDescription; } public void setCourseDescription(String courseDescription) { this.courseDescription = courseDescription; } public String getCoursePrice() { return coursePrice; } public void setCoursePrice(String coursePrice) { this.coursePrice = coursePrice; } public String getBestSuitedFor() { return bestSuitedFor; } public void setBestSuitedFor(String bestSuitedFor) { this.bestSuitedFor = bestSuitedFor; } public String getCourseImg() { return courseImg; } public void setCourseImg(String courseImg) { this.courseImg = courseImg; } public String getCourseLink() { return courseLink; } public void setCourseLink(String courseLink) { this.courseLink = courseLink; } public CourseRVModal(String courseId, String courseName, String courseDescription, String coursePrice, String bestSuitedFor, String courseImg, String courseLink) { this.courseName = courseName; this.courseId = courseId; this.courseDescription = courseDescription; this.coursePrice = coursePrice; this.bestSuitedFor = bestSuitedFor; this.courseImg = courseImg; this.courseLink = courseLink; } @Override public int describeContents() { return 0; } @Override public void writeToParcel(Parcel dest, int flags) { dest.writeString(courseName); dest.writeString(courseId); dest.writeString(courseDescription); dest.writeString(coursePrice); dest.writeString(bestSuitedFor); dest.writeString(courseImg); dest.writeString(courseLink); } }
Operación CREAR en la base de datos
Paso 13: trabajar con el archivo activity_add_course.xml
Vaya a la aplicación > res > diseño > actividad_añadir_curso.xml y agréguele el siguiente código. Se agregan comentarios en el código para conocer con más detalle.
XML
<?xml version="1.0" encoding="utf-8"?> <ScrollView 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="@color/black_shade_1" tools:context=".AddCourseActivity"> <RelativeLayout android:layout_width="match_parent" android:layout_height="wrap_content"> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical"> <!--edit text for course name--> <com.google.android.material.textfield.TextInputLayout android:id="@+id/idTILCourseName" style="@style/LoginTextInputLayoutStyle" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginLeft="10dp" android:layout_marginTop="10dp" android:layout_marginRight="10dp" android:hint="Enter Course Name" android:padding="5dp" android:textColorHint="@color/white" app:hintTextColor="@color/white"> <com.google.android.material.textfield.TextInputEditText android:id="@+id/idEdtCourseName" android:layout_width="match_parent" android:layout_height="match_parent" android:ems="10" android:importantForAutofill="no" android:inputType="textImeMultiLine|textMultiLine" android:textColor="@color/white" android:textColorHint="@color/white" android:textSize="14sp" /> </com.google.android.material.textfield.TextInputLayout> <!--edit text for course price--> <com.google.android.material.textfield.TextInputLayout android:id="@+id/idTILCoursePrice" style="@style/LoginTextInputLayoutStyle" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginLeft="10dp" android:layout_marginTop="10dp" android:layout_marginRight="10dp" android:hint="Enter Course Price" android:padding="5dp" android:textColorHint="@color/white" app:boxStrokeColor="@color/purple_200" app:hintTextColor="@color/white"> <com.google.android.material.textfield.TextInputEditText android:id="@+id/idEdtCoursePrice" android:layout_width="match_parent" android:layout_height="match_parent" android:ems="10" android:importantForAutofill="no" android:inputType="phone" android:textColor="@color/white" android:textColorHint="@color/white" android:textSize="14sp" app:boxStrokeColor="@color/purple_200" /> </com.google.android.material.textfield.TextInputLayout> <!--edit text for course suited for--> <com.google.android.material.textfield.TextInputLayout android:id="@+id/idTILCourseSuitedFor" style="@style/LoginTextInputLayoutStyle" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginLeft="10dp" android:layout_marginTop="10dp" android:layout_marginRight="10dp" android:hint="Enter Course Suited For" android:padding="5dp" android:textColorHint="@color/white" app:hintTextColor="@color/white"> <com.google.android.material.textfield.TextInputEditText android:id="@+id/idEdtSuitedFor" android:layout_width="match_parent" android:layout_height="match_parent" android:ems="10" android:importantForAutofill="no" android:inputType="textImeMultiLine|textMultiLine" android:textColor="@color/white" android:textColorHint="@color/white" android:textSize="14sp" /> </com.google.android.material.textfield.TextInputLayout> <!--edit text for course image link--> <com.google.android.material.textfield.TextInputLayout android:id="@+id/idTILCourseImageLink" style="@style/LoginTextInputLayoutStyle" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginLeft="10dp" android:layout_marginTop="10dp" android:layout_marginRight="10dp" android:hint="Enter Course Image Link" android:padding="5dp" android:textColorHint="@color/white" app:hintTextColor="@color/white"> <com.google.android.material.textfield.TextInputEditText android:id="@+id/idEdtCourseImageLink" android:layout_width="match_parent" android:layout_height="match_parent" android:ems="10" android:importantForAutofill="no" android:inputType="textImeMultiLine|textMultiLine" android:textColor="@color/white" android:textColorHint="@color/white" android:textSize="14sp" /> </com.google.android.material.textfield.TextInputLayout> <!--edit text for course link--> <com.google.android.material.textfield.TextInputLayout android:id="@+id/idTILCourseLink" style="@style/LoginTextInputLayoutStyle" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginLeft="10dp" android:layout_marginTop="10dp" android:layout_marginRight="10dp" android:hint="Enter Course Link" android:padding="5dp" android:textColorHint="@color/white" app:hintTextColor="@color/white"> <com.google.android.material.textfield.TextInputEditText android:id="@+id/idEdtCourseLink" android:layout_width="match_parent" android:layout_height="match_parent" android:ems="10" android:importantForAutofill="no" android:inputType="textImeMultiLine|textMultiLine" android:textColor="@color/white" android:textColorHint="@color/white" android:textSize="14sp" /> </com.google.android.material.textfield.TextInputLayout> <!--edit text for course description--> <com.google.android.material.textfield.TextInputLayout android:id="@+id/idTILCourseDescription" style="@style/LoginTextInputLayoutStyle" android:layout_width="match_parent" android:layout_height="200dp" android:layout_marginLeft="10dp" android:layout_marginTop="10dp" android:layout_marginRight="10dp" android:hint="Enter Course Description" android:padding="5dp" android:textColorHint="@color/white" app:hintTextColor="@color/white"> <com.google.android.material.textfield.TextInputEditText android:id="@+id/idEdtCourseDescription" android:layout_width="match_parent" android:layout_height="match_parent" android:ems="10" android:importantForAutofill="no" android:inputType="textImeMultiLine|textMultiLine" android:textColor="@color/white" android:textColorHint="@color/white" android:textSize="14sp" /> </com.google.android.material.textfield.TextInputLayout> <!--button for adding a new course--> <Button android:id="@+id/idBtnAddCourse" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginStart="10dp" android:layout_marginTop="10dp" android:layout_marginEnd="10dp" android:layout_marginBottom="10dp" android:background="@drawable/button_back" android:text="Add Your Course" android:textAllCaps="false" /> </LinearLayout> <!--progress bar for loading indicator--> <ProgressBar android:id="@+id/idPBLoading" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerInParent="true" android:layout_gravity="center" android:indeterminate="true" android:indeterminateDrawable="@drawable/progress_back" android:visibility="gone" /> </RelativeLayout> </ScrollView>
Paso 14: trabajar con el archivo AddCourseActivity.java
Vaya a la aplicación > java > el nombre del paquete de su aplicación > archivo AddCourseActivity.java y agréguele el siguiente código. Se agregan comentarios en el código para conocer con más detalle.
Java
package com.gtappdevelopers.firebasecrudapp; import android.content.Intent; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.ProgressBar; import android.widget.Toast; import androidx.annotation.NonNull; import androidx.appcompat.app.AppCompatActivity; import com.google.android.material.textfield.TextInputEditText; import com.google.firebase.database.DataSnapshot; import com.google.firebase.database.DatabaseError; import com.google.firebase.database.DatabaseReference; import com.google.firebase.database.FirebaseDatabase; import com.google.firebase.database.ValueEventListener; public class AddCourseActivity extends AppCompatActivity { // creating variables for our button, edit text, // firebase database, database reference, progress bar. private Button addCourseBtn; private TextInputEditText courseNameEdt, courseDescEdt, coursePriceEdt, bestSuitedEdt, courseImgEdt, courseLinkEdt; FirebaseDatabase firebaseDatabase; DatabaseReference databaseReference; private ProgressBar loadingPB; private String courseID; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_add_course); // initializing all our variables. addCourseBtn = findViewById(R.id.idBtnAddCourse); courseNameEdt = findViewById(R.id.idEdtCourseName); courseDescEdt = findViewById(R.id.idEdtCourseDescription); coursePriceEdt = findViewById(R.id.idEdtCoursePrice); bestSuitedEdt = findViewById(R.id.idEdtSuitedFor); courseImgEdt = findViewById(R.id.idEdtCourseImageLink); courseLinkEdt = findViewById(R.id.idEdtCourseLink); loadingPB = findViewById(R.id.idPBLoading); firebaseDatabase = FirebaseDatabase.getInstance(); // on below line creating our database reference. databaseReference = firebaseDatabase.getReference("Courses"); // adding click listener for our add course button. addCourseBtn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { loadingPB.setVisibility(View.VISIBLE); // getting data from our edit text. String courseName = courseNameEdt.getText().toString(); String courseDesc = courseDescEdt.getText().toString(); String coursePrice = coursePriceEdt.getText().toString(); String bestSuited = bestSuitedEdt.getText().toString(); String courseImg = courseImgEdt.getText().toString(); String courseLink = courseLinkEdt.getText().toString(); courseID = courseName; // on below line we are passing all data to our modal class. CourseRVModal courseRVModal = new CourseRVModal(courseID, courseName, courseDesc, coursePrice, bestSuited, courseImg, courseLink); // on below line we are calling a add value event // to pass data to firebase database. databaseReference.addValueEventListener(new ValueEventListener() { @Override public void onDataChange(@NonNull DataSnapshot snapshot) { // on below line we are setting data in our firebase database. databaseReference.child(courseID).setValue(courseRVModal); // displaying a toast message. Toast.makeText(AddCourseActivity.this, "Course Added..", Toast.LENGTH_SHORT).show(); // starting a main activity. startActivity(new Intent(AddCourseActivity.this, MainActivity.class)); } @Override public void onCancelled(@NonNull DatabaseError error) { // displaying a failure message on below line. Toast.makeText(AddCourseActivity.this, "Fail to add Course..", Toast.LENGTH_SHORT).show(); } }); } }); } }
LEER operación desde la base de datos
Paso 15: Crear un elemento para cada curso dentro de nuestra Vista de reciclador.
Navegue a app > res > Haga clic con el botón derecho en él > Nuevo archivo de recursos de diseño y asígnele el nombre Course_rv_item y agréguele el siguiente código. Se agregan comentarios en el código para conocer con más detalle.
XML
<?xml version="1.0" encoding="utf-8"?> <androidx.cardview.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_gravity="center" android:layout_margin="5dp" app:cardCornerRadius="4dp" app:cardElevation="3dp"> <RelativeLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@color/black_shade_1"> <!--image view for our course--> <ImageView android:id="@+id/idIVCourse" android:layout_width="match_parent" android:layout_height="200dp" android:scaleType="centerCrop" /> <!--text view for course name--> <TextView android:id="@+id/idTVCOurseName" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_below="@id/idIVCourse" android:layout_margin="3dp" android:layout_toStartOf="@id/idTVCousePrice" android:layout_toLeftOf="@id/idTVCousePrice" android:padding="4dp" android:text="Course Name" android:textColor="@color/white" android:textSize="15sp" android:textStyle="bold" /> <!--text view for course price--> <TextView android:id="@+id/idTVCousePrice" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@id/idIVCourse" android:layout_alignParentEnd="true" android:layout_alignParentRight="true" android:layout_margin="3dp" android:gravity="center" android:padding="4dp" android:text="Price" android:textColor="@color/white" android:textSize="15sp" android:textStyle="bold" /> </RelativeLayout> </androidx.cardview.widget.CardView>
Paso 16: trabajar con el archivo activity_main.xml
Vaya a la aplicación > res > diseño > actividad_principal.xml y agréguele el siguiente código. Se agregan comentarios en el código para conocer con más detalle.
XML
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout 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:id="@+id/idRLHome" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@color/black_shade_1" tools:context=".MainActivity"> <!--recycler view for our data--> <androidx.recyclerview.widget.RecyclerView android:id="@+id/idRVCourses" android:layout_width="match_parent" android:layout_height="wrap_content" tools:listitem="@layout/course_rv_item" /> <!--progress bar for loading indicator--> <ProgressBar android:id="@+id/idPBLoading" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerInParent="true" android:indeterminate="true" android:indeterminateDrawable="@drawable/progress_back" /> <!--floating action button--> <com.google.android.material.floatingactionbutton.FloatingActionButton android:id="@+id/idFABAddCourse" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentEnd="true" android:layout_alignParentRight="true" android:layout_alignParentBottom="true" android:layout_margin="20dp" android:src="@drawable/ic_add" app:background="@color/black_shade_1" app:backgroundTint="@color/black_shade_2" app:tint="@color/white" /> </RelativeLayout>
Paso 17: crear una clase de adaptador para configurar datos en cada elemento de RecyclerView
Navegue a la aplicación > java > el nombre del paquete de su aplicación > haga clic con el botón derecho en él > Nuevo > clase Java y asígnele el nombre CourseRVAdapter y agréguele el siguiente código. Se agregan comentarios en el código para conocer con más detalle.
Java
package com.gtappdevelopers.firebasecrudapp; import android.content.Context; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.view.animation.Animation; import android.view.animation.AnimationUtils; import android.widget.ImageView; import android.widget.TextView; import androidx.annotation.NonNull; import androidx.recyclerview.widget.RecyclerView; import com.squareup.picasso.Picasso; import java.util.ArrayList; public class CourseRVAdapter extends RecyclerView.Adapter<CourseRVAdapter.ViewHolder> { // creating variables for our list, context, interface and position. private ArrayList<CourseRVModal> courseRVModalArrayList; private Context context; private CourseClickInterface courseClickInterface; int lastPos = -1; // creating a constructor. public CourseRVAdapter(ArrayList<CourseRVModal> courseRVModalArrayList, Context context, CourseClickInterface courseClickInterface) { this.courseRVModalArrayList = courseRVModalArrayList; this.context = context; this.courseClickInterface = courseClickInterface; } @NonNull @Override public CourseRVAdapter.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { // inflating our layout file on below line. View view = LayoutInflater.from(context).inflate(R.layout.course_rv_item, parent, false); return new ViewHolder(view); } @Override public void onBindViewHolder(@NonNull CourseRVAdapter.ViewHolder holder, int position) { // setting data to our recycler view item on below line. CourseRVModal courseRVModal = courseRVModalArrayList.get(position); holder.courseTV.setText(courseRVModal.getCourseName()); holder.coursePriceTV.setText("Rs. " + courseRVModal.getCoursePrice()); Picasso.get().load(courseRVModal.getCourseImg()).into(holder.courseIV); // adding animation to recycler view item on below line. setAnimation(holder.itemView, position); holder.courseIV.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { courseClickInterface.onCourseClick(position); } }); } private void setAnimation(View itemView, int position) { if (position > lastPos) { // on below line we are setting animation. Animation animation = AnimationUtils.loadAnimation(context, android.R.anim.slide_in_left); itemView.setAnimation(animation); lastPos = position; } } @Override public int getItemCount() { return courseRVModalArrayList.size(); } public static class ViewHolder extends RecyclerView.ViewHolder { // creating variable for our image view and text view on below line. private ImageView courseIV; private TextView courseTV, coursePriceTV; public ViewHolder(@NonNull View itemView) { super(itemView); // initializing all our variables on below line. courseIV = itemView.findViewById(R.id.idIVCourse); courseTV = itemView.findViewById(R.id.idTVCOurseName); coursePriceTV = itemView.findViewById(R.id.idTVCousePrice); } } // creating a interface for on click public interface CourseClickInterface { void onCourseClick(int position); } }
Paso 18: Creación de un archivo de menú para mostrar las opciones del menú
Navegue a la aplicación> res> Haga clic con el botón derecho en él> Nuevo> Directorio y asígnele el nombre menú. Ahora navegue al directorio del menú, haga clic con el botón derecho en él> Nuevo> Archivo de recursos de menú y asígnele el nombre menu_main.xml y agregue el código a continuación. Se agregan comentarios en el código para conocer con más detalle.
XML
<?xml version="1.0" encoding="utf-8"?> <menu xmlns:android="http://schemas.android.com/apk/res/android"> <!--specifying item for displaying option--> <item android:id="@+id/idLogOut" android:icon="@drawable/ic_logout" android:title="Log Out" /> </menu>
Paso 19: crear un archivo de diseño para mostrar una hoja inferior
Navegue a la aplicación> res> diseño> Haga clic con el botón derecho en él> Nuevo> Archivo de recursos de diseño y asígnele el nombre bottom_sheet_layout y agregue el código a continuación. Se agregan comentarios en el código para conocer con más detalle.
XML
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/idRLBSheet" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@color/black_shade_1" android:padding="4dp"> <!--text view for displaying course name--> <TextView android:id="@+id/idTVCourseName" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_margin="3dp" android:padding="4dp" android:text="Course Name" android:textColor="@color/white" android:textSize="15sp" android:textStyle="bold" /> <!--image view for displaying course image--> <ImageView android:id="@+id/idIVCourse" android:layout_width="100dp" android:layout_height="100dp" android:layout_below="@id/idTVCourseName" android:layout_centerVertical="true" android:layout_margin="4dp" android:padding="4dp" android:src="@drawable/ic_launcher_background" /> <!--text view for displaying course description--> <TextView android:id="@+id/idTVCourseDesc" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_below="@id/idTVCourseName" android:layout_margin="4dp" android:layout_toEndOf="@id/idIVCourse" android:layout_toRightOf="@id/idIVCourse" android:padding="3dp" android:text="Description" android:textColor="@color/white" /> <!--text view for displaying course best suited for--> <TextView android:id="@+id/idTVSuitedFor" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_below="@id/idTVCourseDesc" android:layout_margin="4dp" android:layout_toRightOf="@id/idIVCourse" android:padding="3dp" android:text="Suited for" android:textColor="@color/white" /> <!--text view for displaying course price--> <TextView android:id="@+id/idTVCoursePrice" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_below="@id/idTVSuitedFor" android:layout_margin="4dp" android:layout_toRightOf="@id/idIVCourse" android:padding="3dp" android:text="Price" android:textColor="@color/white" android:textSize="18sp" android:textStyle="bold" /> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_below="@id/idTVCoursePrice" android:orientation="horizontal" android:weightSum="2"> <!--button for editing course--> <Button android:id="@+id/idBtnEditCourse" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_margin="6dp" android:layout_weight="1" android:text="Edit Course" android:textAllCaps="false" /> <!--button for viewing course details--> <Button android:id="@+id/idBtnVIewDetails" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_margin="6dp" android:layout_weight="1" android:text="View Details" android:textAllCaps="false" /> </LinearLayout> </RelativeLayout>
Paso 20: trabajar con el archivo MainActivity.java
Vaya a la aplicación > java > el nombre del paquete de su aplicación > archivo MainActivity.java y agréguele el siguiente código. Se agregan comentarios en el código para conocer en detalle.
Java
package com.gtappdevelopers.firebasecrudapp; import android.content.Intent; import android.net.Uri; import android.os.Bundle; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.widget.Button; import android.widget.ImageView; import android.widget.ProgressBar; import android.widget.RelativeLayout; import android.widget.TextView; import android.widget.Toast; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.appcompat.app.AppCompatActivity; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; import com.google.android.material.bottomsheet.BottomSheetDialog; import com.google.android.material.floatingactionbutton.FloatingActionButton; import com.google.firebase.auth.FirebaseAuth; import com.google.firebase.database.ChildEventListener; import com.google.firebase.database.DataSnapshot; import com.google.firebase.database.DatabaseError; import com.google.firebase.database.DatabaseReference; import com.google.firebase.database.FirebaseDatabase; import com.squareup.picasso.Picasso; import java.util.ArrayList; public class MainActivity extends AppCompatActivity implements CourseRVAdapter.CourseClickInterface { // creating variables for fab, firebase database, // progress bar, list, adapter,firebase auth, // recycler view and relative layout. private FloatingActionButton addCourseFAB; FirebaseDatabase firebaseDatabase; DatabaseReference databaseReference; private RecyclerView courseRV; private FirebaseAuth mAuth; private ProgressBar loadingPB; private ArrayList<CourseRVModal> courseRVModalArrayList; private CourseRVAdapter courseRVAdapter; private RelativeLayout homeRL; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // initializing all our variables. courseRV = findViewById(R.id.idRVCourses); homeRL = findViewById(R.id.idRLBSheet); loadingPB = findViewById(R.id.idPBLoading); addCourseFAB = findViewById(R.id.idFABAddCourse); firebaseDatabase = FirebaseDatabase.getInstance(); mAuth = FirebaseAuth.getInstance(); courseRVModalArrayList = new ArrayList<>(); // on below line we are getting database reference. databaseReference = firebaseDatabase.getReference("Courses"); // on below line adding a click listener for our floating action button. addCourseFAB.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // opening a new activity for adding a course. Intent i = new Intent(MainActivity.this, AddCourseActivity.class); startActivity(i); } }); // on below line initializing our adapter class. courseRVAdapter = new CourseRVAdapter(courseRVModalArrayList, this, this::onCourseClick); // setting layout malinger to recycler view on below line. courseRV.setLayoutManager(new LinearLayoutManager(this)); // setting adapter to recycler view on below line. courseRV.setAdapter(courseRVAdapter); // on below line calling a method to fetch courses from database. getCourses(); } private void getCourses() { // on below line clearing our list. courseRVModalArrayList.clear(); // on below line we are calling add child event listener method to read the data. databaseReference.addChildEventListener(new ChildEventListener() { @Override public void onChildAdded(@NonNull DataSnapshot snapshot, @Nullable String previousChildName) { // on below line we are hiding our progress bar. loadingPB.setVisibility(View.GONE); // adding snapshot to our array list on below line. courseRVModalArrayList.add(snapshot.getValue(CourseRVModal.class)); // notifying our adapter that data has changed. courseRVAdapter.notifyDataSetChanged(); } @Override public void onChildChanged(@NonNull DataSnapshot snapshot, @Nullable String previousChildName) { // this method is called when new child is added // we are notifying our adapter and making progress bar // visibility as gone. loadingPB.setVisibility(View.GONE); courseRVAdapter.notifyDataSetChanged(); } @Override public void onChildRemoved(@NonNull DataSnapshot snapshot) { // notifying our adapter when child is removed. courseRVAdapter.notifyDataSetChanged(); loadingPB.setVisibility(View.GONE); } @Override public void onChildMoved(@NonNull DataSnapshot snapshot, @Nullable String previousChildName) { // notifying our adapter when child is moved. courseRVAdapter.notifyDataSetChanged(); loadingPB.setVisibility(View.GONE); } @Override public void onCancelled(@NonNull DatabaseError error) { } }); } @Override public void onCourseClick(int position) { // calling a method to display a bottom sheet on below line. displayBottomSheet(courseRVModalArrayList.get(position)); } @Override public boolean onOptionsItemSelected(@NonNull MenuItem item) { // adding a click listener for option selected on below line. int id = item.getItemId(); switch (id) { case R.id.idLogOut: // displaying a toast message on user logged out inside on click. Toast.makeText(getApplicationContext(), "User Logged Out", Toast.LENGTH_LONG).show(); // on below line we are signing out our user. mAuth.signOut(); // on below line we are opening our login activity. Intent i = new Intent(MainActivity.this, LoginActivity.class); startActivity(i); this.finish(); return true; default: return super.onOptionsItemSelected(item); } } @Override public boolean onCreateOptionsMenu(Menu menu) { // on below line we are inflating our menu // file for displaying our menu options. getMenuInflater().inflate(R.menu.menu_main, menu); return true; } private void displayBottomSheet(CourseRVModal modal) { // on below line we are creating our bottom sheet dialog. final BottomSheetDialog bottomSheetTeachersDialog = new BottomSheetDialog(this, R.style.BottomSheetDialogTheme); // on below line we are inflating our layout file for our bottom sheet. View layout = LayoutInflater.from(this).inflate(R.layout.bottom_sheet_layout, homeRL); // setting content view for bottom sheet on below line. bottomSheetTeachersDialog.setContentView(layout); // on below line we are setting a cancelable bottomSheetTeachersDialog.setCancelable(false); bottomSheetTeachersDialog.setCanceledOnTouchOutside(true); // calling a method to display our bottom sheet. bottomSheetTeachersDialog.show(); // on below line we are creating variables for // our text view and image view inside bottom sheet // and initialing them with their ids. TextView courseNameTV = layout.findViewById(R.id.idTVCourseName); TextView courseDescTV = layout.findViewById(R.id.idTVCourseDesc); TextView suitedForTV = layout.findViewById(R.id.idTVSuitedFor); TextView priceTV = layout.findViewById(R.id.idTVCoursePrice); ImageView courseIV = layout.findViewById(R.id.idIVCourse); // on below line we are setting data to different views on below line. courseNameTV.setText(modal.getCourseName()); courseDescTV.setText(modal.getCourseDescription()); suitedForTV.setText("Suited for " + modal.getBestSuitedFor()); priceTV.setText("Rs." + modal.getCoursePrice()); Picasso.get().load(modal.getCourseImg()).into(courseIV); Button viewBtn = layout.findViewById(R.id.idBtnVIewDetails); Button editBtn = layout.findViewById(R.id.idBtnEditCourse); // adding on click listener for our edit button. editBtn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // on below line we are opening our EditCourseActivity on below line. Intent i = new Intent(MainActivity.this, EditCourseActivity.class); // on below line we are passing our course modal i.putExtra("course", modal); startActivity(i); } }); // adding click listener for our view button on below line. viewBtn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // on below line we are navigating to browser // for displaying course details from its url Intent i = new Intent(Intent.ACTION_VIEW); i.setData(Uri.parse(modal.getCourseLink())); startActivity(i); } }); } }
Operación EDITAR Y ELIMINAR en la base de datos
Paso 21: Trabajar con el archivo activity_edit_course.xml
Vaya a la aplicación > res > diseño > actividad_editar_curso.xml y agréguele el siguiente código. Se agregan comentarios en el código para conocer en detalle.
XML
<?xml version="1.0" encoding="utf-8"?> <ScrollView 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="@color/black_shade_1" tools:context=".EditCourseActivity"> <RelativeLayout android:layout_width="match_parent" android:layout_height="wrap_content"> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical"> <!--edit text for adding a course name--> <com.google.android.material.textfield.TextInputLayout android:id="@+id/idTILCourseName" style="@style/LoginTextInputLayoutStyle" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginLeft="10dp" android:layout_marginTop="10dp" android:layout_marginRight="10dp" android:hint="Enter Course Name" android:padding="5dp" android:textColorHint="@color/white" app:hintTextColor="@color/white"> <com.google.android.material.textfield.TextInputEditText android:id="@+id/idEdtCourseName" android:layout_width="match_parent" android:layout_height="match_parent" android:ems="10" android:importantForAutofill="no" android:inputType="textImeMultiLine|textMultiLine" android:textColor="@color/white" android:textColorHint="@color/white" android:textSize="14sp" /> </com.google.android.material.textfield.TextInputLayout> <!--edit text for adding a course price--> <com.google.android.material.textfield.TextInputLayout android:id="@+id/idTILCoursePrice" style="@style/LoginTextInputLayoutStyle" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginLeft="10dp" android:layout_marginTop="10dp" android:layout_marginRight="10dp" android:hint="Enter Course Price" android:padding="5dp" android:textColorHint="@color/white" app:boxStrokeColor="@color/purple_200" app:hintTextColor="@color/white"> <com.google.android.material.textfield.TextInputEditText android:id="@+id/idEdtCoursePrice" android:layout_width="match_parent" android:layout_height="match_parent" android:ems="10" android:importantForAutofill="no" android:inputType="phone" android:textColor="@color/white" android:textColorHint="@color/white" android:textSize="14sp" app:boxStrokeColor="@color/purple_200" /> </com.google.android.material.textfield.TextInputLayout> <!--edit text for adding a course best suited for--> <com.google.android.material.textfield.TextInputLayout android:id="@+id/idTILCourseSuitedFor" style="@style/LoginTextInputLayoutStyle" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginLeft="10dp" android:layout_marginTop="10dp" android:layout_marginRight="10dp" android:hint="Enter Course Suited For" android:padding="5dp" android:textColorHint="@color/white" app:hintTextColor="@color/white"> <com.google.android.material.textfield.TextInputEditText android:id="@+id/idEdtSuitedFor" android:layout_width="match_parent" android:layout_height="match_parent" android:ems="10" android:importantForAutofill="no" android:inputType="textImeMultiLine|textMultiLine" android:textColor="@color/white" android:textColorHint="@color/white" android:textSize="14sp" /> </com.google.android.material.textfield.TextInputLayout> <!--edit text for adding a course image link--> <com.google.android.material.textfield.TextInputLayout android:id="@+id/idTILCourseImageLink" style="@style/LoginTextInputLayoutStyle" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginLeft="10dp" android:layout_marginTop="10dp" android:layout_marginRight="10dp" android:hint="Enter Course Image Link" android:padding="5dp" android:textColorHint="@color/white" app:hintTextColor="@color/white"> <com.google.android.material.textfield.TextInputEditText android:id="@+id/idEdtCourseImageLink" android:layout_width="match_parent" android:layout_height="match_parent" android:ems="10" android:importantForAutofill="no" android:inputType="textImeMultiLine|textMultiLine" android:textColor="@color/white" android:textColorHint="@color/white" android:textSize="14sp" /> </com.google.android.material.textfield.TextInputLayout> <!--edit text for adding a course link--> <com.google.android.material.textfield.TextInputLayout android:id="@+id/idTILCourseLink" style="@style/LoginTextInputLayoutStyle" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginLeft="10dp" android:layout_marginTop="10dp" android:layout_marginRight="10dp" android:hint="Enter Course Link" android:padding="5dp" android:textColorHint="@color/white" app:hintTextColor="@color/white"> <com.google.android.material.textfield.TextInputEditText android:id="@+id/idEdtCourseLink" android:layout_width="match_parent" android:layout_height="match_parent" android:ems="10" android:importantForAutofill="no" android:inputType="textImeMultiLine|textMultiLine" android:textColor="@color/white" android:textColorHint="@color/white" android:textSize="14sp" /> </com.google.android.material.textfield.TextInputLayout> <!--edit text for adding a course description--> <com.google.android.material.textfield.TextInputLayout android:id="@+id/idTILCourseDescription" style="@style/LoginTextInputLayoutStyle" android:layout_width="match_parent" android:layout_height="200dp" android:layout_marginLeft="10dp" android:layout_marginTop="10dp" android:layout_marginRight="10dp" android:hint="Enter Course Description" android:padding="5dp" android:textColorHint="@color/white" app:hintTextColor="@color/white"> <com.google.android.material.textfield.TextInputEditText android:id="@+id/idEdtCourseDescription" android:layout_width="match_parent" android:layout_height="match_parent" android:ems="10" android:importantForAutofill="no" android:inputType="textImeMultiLine|textMultiLine" android:textColor="@color/white" android:textColorHint="@color/white" android:textSize="14sp" /> </com.google.android.material.textfield.TextInputLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" android:weightSum="2"> <!--button for updating a new course--> <Button android:id="@+id/idBtnAddCourse" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginStart="10dp" android:layout_marginTop="10dp" android:layout_marginEnd="10dp" android:layout_marginBottom="10dp" android:layout_weight="1" android:background="@drawable/button_back" android:text="Update Your \n Course" android:textAllCaps="false" /> <!--button for deleting a course--> <Button android:id="@+id/idBtnDeleteCourse" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginStart="10dp" android:layout_marginTop="10dp" android:layout_marginEnd="10dp" android:layout_marginBottom="10dp" android:layout_weight="1" android:background="@drawable/button_back" android:text="Delete Your \n Course" android:textAllCaps="false" /> </LinearLayout> </LinearLayout> <!--progress bar for displaying a loading indicator--> <ProgressBar android:id="@+id/idPBLoading" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerInParent="true" android:layout_gravity="center" android:layout_marginTop="20dp" android:indeterminate="true" android:indeterminateDrawable="@drawable/progress_back" android:visibility="gone" /> </RelativeLayout> </ScrollView>
Paso 22: trabajar con el archivo EditCourseActivity.java
Vaya a la aplicación > java > el nombre del paquete de su aplicación > archivo EditCourseActivity.java y agréguele el siguiente código. Se agregan comentarios en el código para conocer con más detalle.
Java
package com.gtappdevelopers.firebasecrudapp; import android.content.Intent; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.ProgressBar; import android.widget.Toast; import androidx.annotation.NonNull; import androidx.appcompat.app.AppCompatActivity; import com.google.android.material.textfield.TextInputEditText; import com.google.firebase.database.DataSnapshot; import com.google.firebase.database.DatabaseError; import com.google.firebase.database.DatabaseReference; import com.google.firebase.database.FirebaseDatabase; import com.google.firebase.database.ValueEventListener; import java.util.HashMap; import java.util.Map; public class EditCourseActivity extends AppCompatActivity { // creating variables for our edit text, firebase database, // database reference, course rv modal,progress bar. private TextInputEditText courseNameEdt, courseDescEdt, coursePriceEdt, bestSuitedEdt, courseImgEdt, courseLinkEdt; FirebaseDatabase firebaseDatabase; DatabaseReference databaseReference; CourseRVModal courseRVModal; private ProgressBar loadingPB; // creating a string for our course id. private String courseID; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_edit_course); // initializing all our variables on below line. Button addCourseBtn = findViewById(R.id.idBtnAddCourse); courseNameEdt = findViewById(R.id.idEdtCourseName); courseDescEdt = findViewById(R.id.idEdtCourseDescription); coursePriceEdt = findViewById(R.id.idEdtCoursePrice); bestSuitedEdt = findViewById(R.id.idEdtSuitedFor); courseImgEdt = findViewById(R.id.idEdtCourseImageLink); courseLinkEdt = findViewById(R.id.idEdtCourseLink); loadingPB = findViewById(R.id.idPBLoading); firebaseDatabase = FirebaseDatabase.getInstance(); // on below line we are getting our modal class on which we have passed. courseRVModal = getIntent().getParcelableExtra("course"); Button deleteCourseBtn = findViewById(R.id.idBtnDeleteCourse); if (courseRVModal != null) { // on below line we are setting data to our edit text from our modal class. courseNameEdt.setText(courseRVModal.getCourseName()); coursePriceEdt.setText(courseRVModal.getCoursePrice()); bestSuitedEdt.setText(courseRVModal.getBestSuitedFor()); courseImgEdt.setText(courseRVModal.getCourseImg()); courseLinkEdt.setText(courseRVModal.getCourseLink()); courseDescEdt.setText(courseRVModal.getCourseDescription()); courseID = courseRVModal.getCourseId(); } // on below line we are initialing our database reference and we are adding a child as our course id. databaseReference = firebaseDatabase.getReference("Courses").child(courseID); // on below line we are adding click listener for our add course button. addCourseBtn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // on below line we are making our progress bar as visible. loadingPB.setVisibility(View.VISIBLE); // on below line we are getting data from our edit text. String courseName = courseNameEdt.getText().toString(); String courseDesc = courseDescEdt.getText().toString(); String coursePrice = coursePriceEdt.getText().toString(); String bestSuited = bestSuitedEdt.getText().toString(); String courseImg = courseImgEdt.getText().toString(); String courseLink = courseLinkEdt.getText().toString(); // on below line we are creating a map for // passing a data using key and value pair. Map<String, Object> map = new HashMap<>(); map.put("courseName", courseName); map.put("courseDescription", courseDesc); map.put("coursePrice", coursePrice); map.put("bestSuitedFor", bestSuited); map.put("courseImg", courseImg); map.put("courseLink", courseLink); map.put("courseId", courseID); // on below line we are calling a database reference on // add value event listener and on data change method databaseReference.addValueEventListener(new ValueEventListener() { @Override public void onDataChange(@NonNull DataSnapshot snapshot) { // making progress bar visibility as gone. loadingPB.setVisibility(View.GONE); // adding a map to our database. databaseReference.updateChildren(map); // on below line we are displaying a toast message. Toast.makeText(EditCourseActivity.this, "Course Updated..", Toast.LENGTH_SHORT).show(); // opening a new activity after updating our coarse. startActivity(new Intent(EditCourseActivity.this, MainActivity.class)); } @Override public void onCancelled(@NonNull DatabaseError error) { // displaying a failure message on toast. Toast.makeText(EditCourseActivity.this, "Fail to update course..", Toast.LENGTH_SHORT).show(); } }); } }); // adding a click listener for our delete course button. deleteCourseBtn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // calling a method to delete a course. deleteCourse(); } }); } private void deleteCourse() { // on below line calling a method to delete the course. databaseReference.removeValue(); // displaying a toast message on below line. Toast.makeText(this, "Course Deleted..", Toast.LENGTH_SHORT).show(); // opening a main activity on below line. startActivity(new Intent(EditCourseActivity.this, MainActivity.class)); } }
Nota : todos los elementos de diseño utilizados dentro de la aplicación están presentes en app > res > drawable . Puede consultar el proyecto en el siguiente enlace de GitHub .
Ahora ejecute su aplicación y vea el resultado de la aplicación.
Producción:
Publicación traducida automáticamente
Artículo escrito por chaitanyamunje y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA