Bienvenido a Universo Android

Estamos actualizando el sitio web! Pronto subiremos el nuevo diseño de la web! Gracias por su paciencia!

🔒 Cómo Crear un Login y Registro en Android con Firebase

Hola amigos 👋

Bienvenidos a un nuevo tutorial de Universo Android. Hoy aprenderemos a crear un sistema completo de Login y Registro en Android utilizando Firebase Authentication, una de las herramientas más usadas para autenticar usuarios en apps reales.

Al finalizar este tutorial tendrás una aplicación funcional que permitirá:

  • Registrar usuarios con email y contraseña

  • Iniciar sesión

  • Validar campos

  • Mostrar mensajes de error

  • Redirigir al usuario a la pantalla principal


🟩 1. Crear el Proyecto en Android Studio

Creamos un nuevo proyecto en Android Studio con Empty Activity.


🟩 2. Conectar Android Studio con Firebase

  1. Ve a Tools → Firebase

  2. Abre Authentication

  3. Selecciona Email/Password Authentication

  4. Haz clic en Connect Your App to Firebase

  5. Pulsa Add Firebase Authentication to your App


🟩 3. Activar el método de Email/Password en Firebase

En la consola de Firebase:

  1. Autenticación

  2. Métodos de acceso

  3. Activa Email/Password


🟩 4. Diseño XML para Login

Crea un archivo llamado:
📄 activity_login.xml

<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:padding="20dp" android:orientation="vertical"> <EditText android:id="@+id/txtEmailLogin" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="Correo electrónico" /> <EditText android:id="@+id/txtPasswordLogin" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="Contraseña" android:inputType="textPassword" /> <Button android:id="@+id/btnLogin" android:text="Iniciar Sesión" android:layout_width="match_parent" android:layout_height="wrap_content" /> <TextView android:id="@+id/goToRegister" android:text="¿No tienes cuenta? Regístrate aquí." android:layout_width="wrap_content" android:layout_height="wrap_content" /> </LinearLayout>

🟩 5. Diseño XML para Registro

Crea:
📄 activity_register.xml

<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:padding="20dp" android:orientation="vertical"> <EditText android:id="@+id/txtEmailReg" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="Correo electrónico" /> <EditText android:id="@+id/txtPasswordReg" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="Contraseña" android:inputType="textPassword" /> <Button android:id="@+id/btnRegister" android:text="Crear Cuenta" android:layout_width="match_parent" android:layout_height="wrap_content" /> </LinearLayout>

🟩 6. Lógica Java del Registro

📄 RegisterActivity.java

import androidx.appcompat.app.AppCompatActivity; import android.os.Bundle; import android.widget.*; import com.google.firebase.auth.FirebaseAuth; public class RegisterActivity extends AppCompatActivity { EditText txtEmailReg, txtPasswordReg; Button btnRegister; FirebaseAuth mAuth; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_register); txtEmailReg = findViewById(R.id.txtEmailReg); txtPasswordReg = findViewById(R.id.txtPasswordReg); btnRegister = findViewById(R.id.btnRegister); mAuth = FirebaseAuth.getInstance(); btnRegister.setOnClickListener(v -> registerUser()); } private void registerUser() { String email = txtEmailReg.getText().toString(); String pass = txtPasswordReg.getText().toString(); if (email.isEmpty() || pass.isEmpty()) { Toast.makeText(this, "Completa todos los campos", Toast.LENGTH_SHORT).show(); return; } mAuth.createUserWithEmailAndPassword(email, pass) .addOnSuccessListener(authResult -> Toast.makeText(this, "Registro exitoso", Toast.LENGTH_SHORT).show()) .addOnFailureListener(e -> Toast.makeText(this, "Error: " + e.getMessage(), Toast.LENGTH_SHORT).show()); } }

🟩 7. Lógica Java del Login

📄 LoginActivity.java

import androidx.appcompat.app.AppCompatActivity; import android.content.Intent; import android.os.Bundle; import android.widget.*; import com.google.firebase.auth.FirebaseAuth; public class LoginActivity extends AppCompatActivity { EditText txtEmailLogin, txtPasswordLogin; Button btnLogin; FirebaseAuth mAuth; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_login); txtEmailLogin = findViewById(R.id.txtEmailLogin); txtPasswordLogin = findViewById(R.id.txtPasswordLogin); btnLogin = findViewById(R.id.btnLogin); mAuth = FirebaseAuth.getInstance(); btnLogin.setOnClickListener(v -> loginUser()); } private void loginUser() { String email = txtEmailLogin.getText().toString(); String pass = txtPasswordLogin.getText().toString(); if (email.isEmpty() || pass.isEmpty()) { Toast.makeText(this, "Completa todos los campos", Toast.LENGTH_SHORT).show(); return; } mAuth.signInWithEmailAndPassword(email, pass) .addOnSuccessListener(authResult -> { Toast.makeText(this, "Bienvenido", Toast.LENGTH_SHORT).show(); startActivity(new Intent(this, MainActivity.class)); }) .addOnFailureListener(e -> Toast.makeText(this, "Error: " + e.getMessage(), Toast.LENGTH_SHORT).show()); } }

🟩 8. Permisos en AndroidManifest

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

🟩 9. Resultado Final

Con todos estos pasos tendrás una aplicación totalmente funcional de Login y Registro con Firebase Authentication.


▶️ Cómo ejecutar tu aplicación

  1. Abre Android Studio.

  2. Presiona Run para ejecutar el proyecto.

  3. Si no tienes un emulador, crea uno desde AVD Manager.

  4. Verás tu lista horizontal funcionando en pantalla.


🧪 Resultado Final 

Tu aplicación mostrará todos los elementos de la siguiente forma.


📥 Descargar Proyecto de Ejemplo

Puedes descargar el proyecto completo desde el siguiente enlace:

👉 Descargar


🙌 Gracias por visitar mi blog

Si este tutorial  te fue útil:

✔️ Compártelo
✔️ Déjame un comentario
✔️ Sígueme para más contenido sobre Android y programación

¡Estoy aquí para ayudarte!


Preguntas Frecuentes (FAQ)

1. ¿Puedo usar Firebase gratuitamente?

Sí, con el plan Spark puedes usar correo y contraseña sin costo.

2. ¿Es seguro autenticar usuarios en Firebase?

Sí, Firebase usa encriptación y protocolos seguros.

3. ¿Puedo agregar Google o Facebook Login?

Sí, Firebase tiene soporte para múltiples proveedores.

4. ¿Necesito un backend propio?

No, Firebase Authentication actúa como backend.


📰 Mi experiencia como desarrollador de videojuegos indie!


 
Hola amigos! 

Estoy compartiendo mi experiencia en el mundo del desarrollo de videojuegos, la cual ha sido muy difícil, amigos deje mi trabajo para poder intentarlo en un periodo de 6 meses, el trayecto fue difícil. 

En los primeros días ordene mis ideas de como quería desarrollar mi videojuego, tenia claro que dirección iba a llevar solo tenia mucho trabajo por hacer y un miedo profundo por si lo lograría. 

Cometí varios errores de los cuales me hubiera gustado aprender en ese momento era Enero de 2023, no tenia idea de que eso cambiaria mi vida. 

📱El Caballero del Infierno / Hellbound Kinght

 🌑 El Caballero del Infierno – Plataformas de acción oscura en pixel art

Adéntrate en las profundidades del inframundo y toma el control del Caballero del Infierno, un guerrero condenado que busca redención… o venganza.

En este juego de plataformas estilo pixel art, desafiarás a las criaturas más temidas del más allá, superarás trampas letales y explorarás zonas malditas llenas de secretos, todo mientras descubres los fragmentos de tu alma perdida.

🔥 Características principales:

Explora un mundo infernal dividido en zonas únicas, cada una con enemigos, obstáculos y desafíos propios.

Domina habilidades como el doble salto, dash aéreo, escalada y más a medida que avanzas.

Enfrenta a poderosos jefes y desbloquea nuevas rutas con cada victoria.

Descubre 10 misiones principales con narrativa inspirada en La Divina Comedia y el folclore infernal.

Estilo pixel art detallado, animaciones fluidas y ambientación sonora envolvente.

Frases oscuras y poéticas del Infierno de Dante te guiarán (o atormentarán) en cada etapa.






Disponible:


Chef Explorador

Conviértete en el chef mas famoso del mundo.

En este juego de aventura y cocina, administraras un restaurante mientras cumples con los pedidos de tus clientes. Para preparar los platillos deveras viajar por niveles únicos, recolectando ingredientes frescos superándosela obstáculos. 

Completa los pedidos para ganar monedas y canjear skins de personajes.

Viaja por distintos niveles para recolectar ingredientes.

Combina la acción y la estrategia.

Demuestra tus habilidades en la cocina y se el mejor chef de todos.





Disponible:

Erandique - Juego Android

ERANDIQUE

Erandique un gran héroe que se enfrenta a numerosas aventuras para defender a su patria. El guerrero deberá superar múltiples misiones y enfrentarse a numerosos enemigos, algunos de ellos muy poderosos, para lograr alcanzar su objetivo. Aprende sobre la historia y la cultura de Honduras mientras juegas.

Disponible:





Canal de Twitch

Hola amigos! Muchas gracias por seguir apoyando mi pagina! Espero todo el contenido en ella les sea de ayuda! Quisiera comunicarles que comencé un canal de Twitch en el cual empecé a compartir como estoy desarrollando videojuegos! Espero su apoyo para seguir creando mas contenido! Muchas gracias de ante mano. Saludos! Con tu follow estaré eternamente agradecido




🚀 Cómo crear y extraer archivos ZIP (Zip / UnZip) en Android usando Java y Android Studio

En este tutorial aprenderás paso a paso cómo comprimir y descomprimir archivos ZIP en Android utilizando Java.
Este ejemplo es ideal para quienes están iniciando en la gestión de archivos en Android, y desean comprender cómo manipular carpetas, crear archivos y trabajar con compresión ZIP.


📘 Contenido del Tutorial

  1. Crear un proyecto en Android Studio

  2. Diseño de la aplicación

  3. Clase ArchivoHelper para crear ZIP y extraer ZIP

  4. Código de MainActivity

  5. Permisos necesarios

  6. Probar la aplicación en un emulador AVD

  7. Preguntas frecuentes (FAQ)


🛠️ Crear un nuevo proyecto en Android Studio

  1. Abre Android Studio

  2. Selecciona New Project → Empty Activity

  3. Usa Java como lenguaje de programación

  4. Asigna un nombre a tu proyecto, por ejemplo:
    ZipUnzipAndroid

Con esto ya tendremos la base para trabajar.


🎨 Diseño de la aplicación (Layout XML)

Este diseño será sencillo: dos botones (Zip y Unzip) y un CheckBox para decidir si incluir la carpeta raíz dentro del ZIP.

Copia este código en res/layout/activity_main.xml:

<?xml version="1.0" encoding="utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity"> <RelativeLayout android:padding="10dp" android:layout_width="match_parent" android:layout_height="match_parent"> <LinearLayout android:id="@+id/buttons" android:orientation="horizontal" android:layout_width="match_parent" android:layout_height="wrap_content"> <Button android:id="@+id/btnZip" android:layout_width="0dp" android:layout_weight="1" android:layout_height="wrap_content" android:text="Zip"/> <Button android:id="@+id/btnUnzip" android:layout_width="0dp" android:layout_weight="1" android:layout_height="wrap_content" android:text="Unzip"/> </LinearLayout> <CheckBox android:id="@+id/chkParent" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Incluir carpeta principal en ZIP" android:layout_below="@+id/buttons" android:layout_marginTop="20dp"/> </RelativeLayout> </androidx.constraintlayout.widget.ConstraintLayout>

📦 Código para crear y extraer ZIP en Android

Toda la lógica será manejada por una clase llamada ArchivoHelper, que se encargará de:

✔ Comprimir carpetas o archivos
✔ Extraer archivos ZIP
✔ Crear archivos de texto dummy
✔ Manejar rutas y excepciones

Crea un archivo llamado ArchivoHelper.java y pega lo siguiente:

import android.util.Log; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.util.zip.ZipEntry; import java.util.zip.ZipInputStream; import java.util.zip.ZipOutputStream; public class ArchivoHelper { private static final int BUFFER_SIZE = 8192; private static String TAG = ArchivoHelper.class.getName(); private static String parentPath = ""; public static boolean zip(String sourcePath, String destinationPath, String destinationFileName, Boolean includeParentFolder) { new File(destinationPath).mkdirs(); ZipOutputStream zipOutputStream = null; try { if (!destinationPath.endsWith("/")) destinationPath += "/"; String destination = destinationPath + destinationFileName; File file = new File(destination); if (!file.exists()) file.createNewFile(); FileOutputStream fileOutputStream = new FileOutputStream(file); zipOutputStream = new ZipOutputStream(new BufferedOutputStream(fileOutputStream)); parentPath = includeParentFolder ? new File(sourcePath).getParent() + "/" : sourcePath; zipFile(zipOutputStream, sourcePath); } catch (IOException ioe) { Log.d(TAG, ioe.getMessage()); return false; } finally { try { if (zipOutputStream != null) zipOutputStream.close(); } catch (IOException ignore) {} } return true; } private static void zipFile(ZipOutputStream zipOutputStream, String sourcePath) throws IOException { File files = new File(sourcePath); File[] fileList = files.listFiles(); for (File file : fileList) { if (file.isDirectory()) { zipFile(zipOutputStream, file.getPath()); } else { byte[] data = new byte[BUFFER_SIZE]; BufferedInputStream input = new BufferedInputStream(new FileInputStream(file.getPath()), BUFFER_SIZE); String entryPath = file.getAbsolutePath().replace(parentPath, ""); ZipEntry entry = new ZipEntry(entryPath); zipOutputStream.putNextEntry(entry); int count; while ((count = input.read(data)) != -1) zipOutputStream.write(data, 0, count); input.close(); } } } public static Boolean unzip(String sourceFile, String destinationFolder) { ZipInputStream zis = null; try { zis = new ZipInputStream(new BufferedInputStream(new FileInputStream(sourceFile))); ZipEntry ze; byte[] buffer = new byte[BUFFER_SIZE]; while ((ze = zis.getNextEntry()) != null) { String fileName = ze.getName(); fileName = fileName.substring(fileName.indexOf("/") + 1); File file = new File(destinationFolder, fileName); File dir = ze.isDirectory() ? file : file.getParentFile(); if (!dir.isDirectory()) dir.mkdirs(); if (ze.isDirectory()) continue; FileOutputStream fout = new FileOutputStream(file); int count; while ((count = zis.read(buffer)) != -1) fout.write(buffer, 0, count); fout.close(); } } catch (IOException ioe) { Log.d(TAG, ioe.getMessage()); return false; } finally { try { if (zis != null) zis.close(); } catch (IOException ignore) {} } return true; } public static void saveToFile(String destinationPath, String data, String fileName) { try { new File(destinationPath).mkdirs(); File file = new File(destinationPath + fileName); if (!file.exists()) file.createNewFile(); FileOutputStream fileOutputStream = new FileOutputStream(file, true); fileOutputStream.write((data + System.lineSeparator()).getBytes()); } catch (IOException ex) { Log.d(TAG, ex.getMessage()); } } }

🎛️ Clase MainActivity

Aquí conectamos los botones del layout con las funciones ZIP/UNZIP.

Copia este código en MainActivity.java:

import androidx.appcompat.app.AppCompatActivity; import android.os.Bundle; import android.os.Environment; import android.widget.Button; import android.widget.CheckBox; import android.widget.Toast; public class MainActivity extends AppCompatActivity { private String SDPath = Environment.getExternalStorageDirectory().getAbsolutePath(); private String dataPath = SDPath + "/instinctcoder/zipunzip/data/"; private String zipPath = SDPath + "/instinctcoder/zipunzip/zip/"; private String unzipPath = SDPath + "/instinctcoder/zipunzip/unzip/"; Button btnUnzip, btnZip; CheckBox chkParent; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); btnUnzip = findViewById(R.id.btnUnzip); btnZip = findViewById(R.id.btnZip); chkParent = findViewById(R.id.chkParent); btnUnzip.setOnClickListener(v -> { if (ArchivoHelper.unzip(zipPath + "dummy.zip", unzipPath)) { Toast.makeText(MainActivity.this, "Unzip realizado con éxito.", Toast.LENGTH_LONG).show(); } }); btnZip.setOnClickListener(v -> { if (ArchivoHelper.zip(dataPath, zipPath, "dummy.zip", chkParent.isChecked())) { Toast.makeText(MainActivity.this, "Zip creado con éxito.", Toast.LENGTH_LONG).show(); } }); // Crear archivos de prueba (dummy) ArchivoHelper.saveToFile(dataPath, "Este es el archivo dummy 01", "Dummy1.txt"); ArchivoHelper.saveToFile(dataPath, "Este es el archivo dummy 02", "Dummy2.txt"); ArchivoHelper.saveToFile(dataPath, "Este es el archivo dummy 03", "Dummy3.txt"); } }

🔐 Permisos necesarios

Agrega este permiso en tu archivo AndroidManifest.xml:

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

En Android 10+ deberás pedir el permiso en tiempo de ejecución (Runtime Permission).


📱 Probar la aplicación en un emulador AVD

  1. Crea un emulador AVD desde Android Studio

  2. Ejecuta tu proyecto

  3. Prueba comprimir archivos y extraerlos dentro del emulador


🧪 Resultado Final

✔ Tendrás un ZIP creado desde tus propios archivos
✔ Podrás extraerlo en la ubicación que definas
✔ Aprenderás a manejar directorios, archivos y flujos de entrada/salida
✔ Ideal para aprender gestión de archivos avanzada en Android


❓ Preguntas frecuentes (FAQ)

1. ¿Necesito permisos especiales para crear ZIP o extraer ZIP?

Sí, necesitas el permiso WRITE_EXTERNAL_STORAGE para trabajar con almacenamiento externo.

2. ¿Puedo trabajar solo con almacenamiento interno?

Sí. Puedes usar getFilesDir() y no necesitarás permisos.

3. ¿Se puede modificar para comprimir solo archivos específicos?

Sí, solo debes procesar los archivos que desees antes de pasarlos al método zip().

4. ¿Android permite descomprimir ZIP con subcarpetas?

Sí, el código soporta subcarpetas sin problema.

Cómo Escribir y Leer Archivos de Texto en Android: Tutorial Completo

Cómo Escribir y Leer Archivos de Texto en Android: Tutorial Completo

Aprende paso a paso cómo crear una aplicación Android que pueda guardar y leer archivos de texto usando Java y Android Studio. Este tutorial está diseñado para principiantes que quieren entender la gestión de archivos en Android.


Contenido del Tutorial

  1. Crear un proyecto en Android Studio

  2. Diseño de la aplicación

  3. Código para escribir y leer archivos de texto

  4. Permisos necesarios

  5. Probar la aplicación en un emulador AVD

  6. Preguntas frecuentes (FAQ)


Crear un proyecto en Android Studio

Abre Android Studio y crea un nuevo proyecto con Activity vacío. Para este ejemplo, puedes seguir este enlace de referencia.

Asegúrate de usar Java como lenguaje principal.


Diseño de la aplicación

Vamos a crear un diseño simple que permita al usuario ingresar texto, guardar y leer el contenido de un archivo.

<?xml version="1.0" encoding="utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity"> <RelativeLayout android:padding="10dp" android:layout_width="match_parent" android:layout_height="match_parent"> <LinearLayout android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <EditText android:id="@+id/txtInput" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="Escribe algo que almacenar" android:gravity="top" /> <LinearLayout android:orientation="horizontal" android:layout_width="match_parent" android:layout_height="wrap_content"> <Button android:id="@+id/btnSave" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Guardar" android:layout_weight="1" /> <Button android:id="@+id/btnRead" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Leer" android:layout_weight="1" /> </LinearLayout> <TextView android:id="@+id/txtContent" android:layout_width="match_parent" android:layout_height="match_parent" android:inputType="textMultiLine" android:scrollIndicators="bottom|right" android:editable="false" /> </LinearLayout> </RelativeLayout> </androidx.constraintlayout.widget.ConstraintLayout>

Código para escribir y leer archivos de texto

Clase ArchivoHelper

import android.content.Context; import android.os.Environment; import android.util.Log; import java.io.*; public class ArchivoHelper { final static String fileName = "data.txt"; final static String path = Environment.getExternalStorageDirectory().getAbsolutePath() + "/instinctcoder/readwrite/"; final static String TAG = ArchivoHelper.class.getName(); // Leer información del archivo public static String ReadFile(Context context){ String line = null; try { FileInputStream fileInputStream = new FileInputStream(new File(path + fileName)); BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(fileInputStream)); StringBuilder stringBuilder = new StringBuilder(); while ((line = bufferedReader.readLine()) != null) { stringBuilder.append(line).append(System.getProperty("line.separator")); } bufferedReader.close(); fileInputStream.close(); return stringBuilder.toString(); } catch (IOException ex) { Log.d(TAG, ex.getMessage()); return null; } } // Guardar información en el archivo public static boolean saveToFile(String data){ try { new File(path).mkdirs(); File file = new File(path + fileName); if (!file.exists()) file.createNewFile(); FileOutputStream fileOutputStream = new FileOutputStream(file, true); fileOutputStream.write((data + System.getProperty("line.separator")).getBytes()); fileOutputStream.close(); return true; } catch (IOException ex) { Log.d(TAG, ex.getMessage()); return false; } } }

Clase MainActivity

import android.os.Bundle; import android.view.View; import android.widget.*; import androidx.appcompat.app.AppCompatActivity; public class MainActivity extends AppCompatActivity { Button btnRead, btnSave; EditText txtInput; TextView txtContent; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); txtContent = findViewById(R.id.txtContent); txtInput = findViewById(R.id.txtInput); btnRead = findViewById(R.id.btnRead); btnSave = findViewById(R.id.btnSave); btnRead.setOnClickListener(v -> txtContent.setText(ArchivoHelper.ReadFile(MainActivity.this))); btnSave.setOnClickListener(v -> { boolean success = ArchivoHelper.saveToFile(txtInput.getText().toString()); Toast.makeText(MainActivity.this, success ? "Guardado con éxito" : "Error al guardar", Toast.LENGTH_SHORT).show(); }); } }

Permisos necesarios

Agrega este permiso en AndroidManifest.xml:

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

Probar la aplicación en un emulador AVD

Crea un emulador AVD en Android Studio y ejecuta tu proyecto para probar la lectura y escritura de archivos.


🧪 Resultado Final

Tu aplicación mostrará todos los elementos de la siguiente forma. 


📥 Descargar Proyecto de Ejemplo

Puedes descargar el proyecto completo desde el siguiente enlace:

👉 Descargar

🙌 Gracias por visitar mi blog

Si este tutorial  te fue útil:

✔️ Compártelo
✔️ Déjame un comentario
✔️ Sígueme para más contenido sobre Android y programación

¡Estoy aquí para ayudarte!

Preguntas frecuentes (FAQ)

1. ¿Se necesita algún permiso especial para guardar archivos en Android?
Sí, se requiere WRITE_EXTERNAL_STORAGE para guardar archivos en la memoria externa.

2. ¿Puedo usar memoria interna en lugar de externa?
Sí, usando context.openFileInput() y context.openFileOutput(), no necesitas permisos adicionales.

3. ¿Qué pasa si el archivo no existe al leerlo?
El método retornará null. Se recomienda manejar este caso mostrando un mensaje al usuario.

4. ¿Se puede sobrescribir el archivo en lugar de añadir datos?
Sí, cambia new FileOutputStream(file, true) a new FileOutputStream(file, false).

Como crear un Spinner utilizando SQLite Database en Android

Como crear un Spinner utilizando SQLite Database en Android
Como crear un Spinner utilizando SQLite Database en Android

Como crear un Spinner utilizando SQLite en Android

Hola amigos vamos a crear un pequeño tutorial de como crear un Spinner utilizando SQLite en Android Studio vamos a iniciar con este pequeño ejemplo 

¿Que es SQLite Database?

SQLite es una base de datos SQL de código abierto que almacena datos en un archivo de texto en un dispositivo. Android viene con implementación de base de datos SQLite incorporada.

SQLite admite todas las características de la base de datos relacional. Para acceder a esta base de datos, no es necesario establecer ningún tipo de conexión, como JDBC, ODBC, etc.

Como crear un Proyecto en Android Studio

Vamos a crear un proyecto en Android estudio para poder continuar con este ejemplo vamos a seguir el siguiente link. (Aquí). 

Diseño de Spinner utilizando SQLite Database

El diseño de nuestra aplicación quedara de la siguiente forma utilizando los controles que describiré acontinuación.
<android.support.design.widget.CoordinatorLayout 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:fitsSystemWindows="true"
    tools:context=".MainActivity">
    <RelativeLayout
        android:layout_height="match_parent"
        android:layout_width="match_parent"
        android:paddingLeft="@dimen/activity_horizontal_margin"
        android:paddingRight="@dimen/activity_horizontal_margin"
        android:paddingTop="@dimen/activity_vertical_margin"
        android:paddingBottom="@dimen/activity_vertical_margin">

        <Spinner
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/spinStudent_Simple"
            android:layout_below="@+id/tvSpinner"
            android:layout_alignParentStart="true" />

        <Spinner
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/spinStudent"
            android:layout_below="@+id/tvStudent"
            android:layout_alignParentStart="true" />

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Spinner Simple"
            android:id="@+id/tvSpinner"
            android:layout_alignParentTop="true"
            android:layout_alignParentStart="true" />

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Spinner"
            android:id="@+id/tvStudent"
            android:layout_below="@+id/spinStudent_Simple"
            android:layout_alignParentStart="true" />

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Name"
            android:id="@+id/tvName"
            android:layout_below="@+id/spinStudent"
            android:layout_alignParentStart="true"
            android:layout_marginTop="32dp" />

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Age"
            android:id="@+id/tvAge"
            android:layout_marginTop="38dp"
            android:layout_below="@+id/tvName"
            android:layout_alignParentStart="true" />

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Email"
            android:id="@+id/tvEmail"
            android:layout_marginTop="38dp"
            android:layout_below="@+id/tvAge"
            android:layout_alignParentStart="true" />

    </RelativeLayout>
</android.support.design.widget.CoordinatorLayout>
Es muy sencillo de crear nuestro diseño.

Código de nuestra aplicación Spinner utilizando SQlite Database en Android

Vamos a continuar con el código de nuestra aplicación de forma muy sencilla para que puedan desarrollarlo en su aplicación.

Comenzaremos creando una clase a la que llamaremos Estudiantes
El código para nuestra clase sera el siguiente.
public class Estudiantes {
    // Labels table name
    public static final String TABLE = "Student";

    // Labels Table Columns names
    public static final String KEY_ID = "id";
    public static final String KEY_name = "name";
    public static final String KEY_email = "email";
    public static final String KEY_age = "age";

    private int student_ID;
    private String name;
    private String email;
    private int age;

    public void setAge(Integer age){
        this.age=age;
    }

    public Integer getAge(){
        return this.age;
    }

    public void setName(String name){
        this.name=name;
    }

    public String getName(){
        return this.name;
    }

    public void setEmail(String email){
        this.email=email;
    }

    public String getEmail(){
        return this.email;
    }

    public void setStudent_ID(Integer student_ID){
        this.student_ID=student_ID;
    }

    public Integer getStudent_ID(){
        return this.student_ID;
    }
}
Luego crearemos una clase a la que llamaremos SQLiteDB
Y escribiremos las siguientes sentencias de código.
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

public class SQLiteDB extends SQLiteOpenHelper {

    private static final int DATABASE_VERSION = 1;
    // Nombre de la base de datos
    private static final String DATABASE_NAME = "spinner.db";
    public SQLiteDB(Context context ) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
        // TODO Auto-generated constructor stub
    }

    @Override
    public void onCreate(SQLiteDatabase db) {

        String CREATE_TABLE_STUDENT = "CREATE TABLE " + Estudiantes.TABLE  + "("
                + Estudiantes.KEY_ID  + " INTEGER PRIMARY KEY AUTOINCREMENT ,"
                + Estudiantes.KEY_name + " TEXT, "
                + Estudiantes.KEY_age + " INTEGER, "
                + Estudiantes.KEY_email + " TEXT )";

        db.execSQL(CREATE_TABLE_STUDENT);

    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        // Drop older table if existed, all data will be gone
        db.execSQL("DROP TABLE IF EXISTS " + Estudiantes.TABLE);

        // Create tables again
        onCreate(db);

    }
}


Ahora añadiremos la clase que se encargara de insertar la información en nuestra base de datos SQlite. se llamara EstudianteReport


import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.DatabaseUtils;
import android.database.sqlite.SQLiteDatabase;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

public class EstudianteReport {
    private SQLiteDB dbHelper;

    public EstudianteReport(Context context) {
        dbHelper = new SQLiteDB(context);
    }

    //Delete all data in the table
    public void Delete() {
        SQLiteDatabase db = dbHelper.getWritableDatabase();
        db.delete(Estudiantes.TABLE, null, null);
        db.close(); // Closing database connection
    }

    //Insert student records
    public int insert(Estudiantes student) {
        // TODO Auto-generated method stub
        //Integer noStudent = getStudentCount();

        SQLiteDatabase db = dbHelper.getWritableDatabase();
        ContentValues values = new ContentValues();
        values.put(Estudiantes.KEY_age, student.getAge());
        values.put(Estudiantes.KEY_email, student.getEmail());
        values.put(Estudiantes.KEY_name, student.getName());

        // Inserting Row
        long student_Id = db.insert(Estudiantes.TABLE, null, values);
        db.close(); // Closing database connection
        return (int) student_Id;
    }
    //Retrieve all records and populate into List<Student>
    //This method allow you to retrieve more fields/information into List.
    public List<Estudiantes> getAll() {
        SQLiteDatabase db = dbHelper.getReadableDatabase();
        String selectQuery = "SELECT  " +
                Estudiantes.KEY_ID + "," +
                Estudiantes.KEY_name + "," +
                Estudiantes.KEY_email + "," +
                Estudiantes.KEY_age +
                " FROM " + Estudiantes.TABLE;

        List<Estudiantes> studentList = new ArrayList<Estudiantes>() ;
        Cursor cursor = db.rawQuery(selectQuery, null);

        // looping through all rows and adding to list
        if (cursor.moveToFirst()) {
            do {
                Estudiantes student  = new Estudiantes();
                student.setAge(cursor.getInt(cursor.getColumnIndex(Estudiantes.KEY_age)));
                student.setEmail(cursor.getString(cursor.getColumnIndex(Estudiantes.KEY_email)));
                student.setName(cursor.getString(cursor.getColumnIndex(Estudiantes.KEY_name)));
                student.setStudent_ID(cursor.getInt(cursor.getColumnIndex(Estudiantes.KEY_ID)));
                studentList.add(student);

            } while (cursor.moveToNext());
        }

        cursor.close();
        db.close();
        return studentList;

    }

    //Retrieve all records and populate into List<String>
    public List<String> getAll_Simple() {
        SQLiteDatabase db = dbHelper.getReadableDatabase();
        String selectQuery = "SELECT  " +
                Estudiantes.KEY_age + "," +
                Estudiantes.KEY_name +
                " FROM " + Estudiantes.TABLE;

        List<String> studentList = new ArrayList<String>() ;
        Cursor cursor = db.rawQuery(selectQuery, null);
        Integer i=0;
        // looping through all rows and adding to list
        if (cursor.moveToFirst()) {
            do {
                studentList.add(i,cursor.getString(cursor.getColumnIndex(Estudiantes.KEY_name)));
                i+=1;
            } while (cursor.moveToNext());
        }

        cursor.close();
        db.close();
        return studentList;

    }
}

Y para continuar vamos programar nuestra clase Adaptador de nuestro Spinner.


import android.content.Context;
import android.graphics.Color;
import android.view.Gravity;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.TextView;
import java.util.List;

public class EstudianteSpinnerAdapter extends ArrayAdapter<Estudiantes> {

    private Context mContext;
    private List<Estudiantes> mValues;

    public EstudianteSpinnerAdapter(Context context,
        int textViewResourceId, List<Estudiantes> objects) {
        super(context, textViewResourceId, objects);
        this.mContext = context;
        this.mValues = objects;
    }

    @Override
    public int getCount(){
        return mValues.size();
    }

    @Override
    public Estudiantes getItem(int position){
        return mValues.get(position);
    }

    @Override
    public long getItemId(int position){
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        //This is for the first item before dropdown or default state.
        TextView label = new TextView(mContext);
        label.setTextColor(Color.BLACK);
        label.setTextSize(18);
        label.setText(" " + mValues.get(position).getName());
        label.setHeight(50);
        label.setGravity(Gravity.LEFT | Gravity.CENTER );
        return label;
    }

    @Override
    public View getDropDownView(int position, View convertView,
        ViewGroup parent) {
        //This is when user click the spinner and list of item display
        // beneath it  
        TextView label = new TextView(mContext);
        label.setTextColor(Color.BLACK);
        label.setTextSize(18);
        label.setText(" " + mValues.get(position).getName());
        label.setHeight(70);
        label.setGravity(Gravity.LEFT | Gravity.CENTER );

        return label;
    }
}

Y para terminar en nuestra MainActivity.


import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Spinner;
import android.widget.TextView;
import androidx.appcompat.app.AppCompatActivity;
import java.util.List;

public class MainActivity extends AppCompatActivity implements AdapterView.OnItemSelectedListener  {

    Spinner mSpinStudent, mSpinStudent_Simple;
    TextView mTvName, mTvAge, mTvEmail;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mSpinStudent = (Spinner) findViewById(R.id.spinStudent);
        mSpinStudent_Simple= (Spinner) findViewById(R.id.spinStudent_Simple);

        mTvAge= (TextView) findViewById(R.id.tvAge);
        mTvEmail= (TextView) findViewById(R.id.tvEmail);
        mTvName= (TextView) findViewById(R.id.tvName);

        mSpinStudent.setOnItemSelectedListener(this);
        mSpinStudent_Simple.setOnItemSelectedListener(this);

        insertDummyData();
        loadStudent();
        loadStudent_Simple();
    }

    @Override
    public void onItemSelected(AdapterView<?> parentView, View selectedItemView, int position, long id) {
        if (parentView== findViewById(R.id.spinStudent)){
            Estudiantes selected = (Estudiantes) parentView.getItemAtPosition(position);
            mTvName.setText("Name: " + selected.getName());
            mTvAge.setText( "Age: " + selected.getAge().toString());
            mTvEmail.setText("Email: " + selected.getEmail());
        }
        else if (parentView== findViewById(R.id.spinStudent_Simple)){
            //This is the limitation of this method
            // as no other information could use to display
            //student record except the text.
            mTvName.setText(((TextView) selectedItemView).getText());
            mTvAge.setText("I DON'T KNOW, THIS IS NOT POSSIBLE!!!");
            mTvEmail.setText("I DON'T KNOW YOU NEED TO QUERY DB!!!");
        }
    }

    @Override
    public void onNothingSelected(AdapterView<?> parentView) {
        mTvAge.setText( "");
        mTvEmail.setText( "");
        mTvName.setText("");
    }

    //Insert some dummy data for displaying on spinner
    private void insertDummyData(){

        EstudianteReport repo = new EstudianteReport(this);
        repo.Delete();

        for (Integer i=0;i<5;i++){
            Estudiantes student = new Estudiantes();
            student.setAge(10);
            student.setEmail("tutor@instinctcoder.com");
            student.setName("Tan Woon How " + i.toString());
            repo.insert(student);

        }
    }

    //This is the arrayadapter  binding method as you can see
    private void loadStudent_Simple(){
        ArrayAdapter<String> spinnerAdapter;
        EstudianteReport db = new EstudianteReport(getApplicationContext());
        List<String> students = db.getAll_Simple();
        spinnerAdapter = new ArrayAdapter<String>(MainActivity.this,
                android.R.layout.simple_spinner_item, students);
        mSpinStudent_Simple.setAdapter(spinnerAdapter);

        spinnerAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
    }

    //This is the customize adapter binding method as you can see
    //there is only a slight different if you compare with functino loadStudent_Simple.
    private void loadStudent(){
        EstudianteSpinnerAdapter studentAdapter;
        EstudianteReport db = new EstudianteReport(getApplicationContext());
        List<Estudiantes> students = db.getAll();
        studentAdapter = new EstudianteSpinnerAdapter(MainActivity.this,
                android.R.layout.simple_spinner_item , students );
        mSpinStudent.setAdapter(studentAdapter);

        studentAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
    }

}

Y listo ahora vamos a crear un emulador y ejecutar nuestro ejemplo.

Como crear un emulador AVD en Android(Aquí)

 Y listo espero haya sido de su agrado. Recuerda suscribirte a nuestro canal de Youtube y seguirnos en Facebook. Gracias!

Descargar

Enlace: 

Android Studio - Curso Español