Вы находитесь на странице: 1из 47

TECNOLOGICO DE ESTUDIOS SUPERIORES DE ECATEPEC

DIVISIÓN DE INGENIERÍA EN SISTEMA COMPUTACIONALES

MATERIA: BASES DE DATOS PARA DISPOSITIVOS MÓVILES

PROFESOR: GRISELDA CORTES BARRERA

PRÁCTICA TAREA RFC Y CURP MEJORADO

MENÚ RFC, CURP Y PLACAS MEJORADO


GRUPO: 5851

ALUMNO:
 MUÑOZ VÁZQUEZ OMAR
Firma de la práctica:
1.- Lo primero que se hace es abrir Android Studio y crear un nuevo proyecto,
elegimos la opción de actividad vacía.

2.- Colocamos un nombre al proyecto en este caso Menú, y el lenguaje será Java,
de igual que la API que elegiremos será: API 15 Android 4.0.3 ya que esta es
compatible con el 100% de los dispositivos.
Activity Menú Principal
3.- Se nos generará un activity principal que será el que utilizaremos como nuestro
menú principal.
Adicional a este activity lo que hacemos es crear 3 nuevos activity para esto, del
lado izquierdo tenemos un ícono con la palabra “app” le damos clic derecho y
luego en New, después buscamos Activity y seleccionamos Empty Activity.
Crearemos 3 nuevas ventanas ya que son las 3 opciones de nuestra aplicación
(“CURP”,” RFC”,” Placas”).
Al crearlas de esta manera también se nos generara él .xml que es el diseño de
las pantallas
4.- Los componentes tendrán las siguientes configuraciones
<?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">

El linear Layout tendrá estos parámetros para adaptarse a toda la pantalla de


nuestra aplicación.
<LinearLayout
android:layout_width="411dp"
android:layout_height="443dp"
android:layout_marginBottom="176dp"
android:orientation="vertical"
app:layout_constraintBottom_toBottomOf="parent"
tools:layout_editor_absoluteX="0dp">

En nuestros componentes usaremos Android:layout_gravity=”center_horizontal”


para que asi se muestren centrados y tenga una mejor estética nuestra aplicación.

En la propiedad Text ponemos Menú Principal que es lo que mostrara ese espacio
de texto.
<TextView
android:id="@+id/textView"
android:layout_width="220dp"
android:layout_height="79dp"
android:layout_gravity="center_horizontal"
android:text="Menú Principal"
android:textSize="30sp"
android:typeface="normal" />

RadioGroup es para englobar las opciones disponibles en nuestra aplicación.

RadioButton es cada opción que tendrá el menú principal, cada componente tiene
un nombre, posición, alto y ancho y variara de acuerdo a la estética que
querramos darle a nuestra aplicación.

La opción wrap_content es para asignar el tamaño de acuerdo a su contenido en


cada texto y botón disponible, tanto en su ancho como en su alto.
<RadioGroup
android:layout_width="wrap_content"
android:layout_height="wrap_content" >

<RadioButton
android:id="@+id/rfc"
android:layout_width="88dp"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:text="RFC" />

<RadioButton
android:id="@+id/curp"
android:layout_width="88dp"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:text="CURP" />

<RadioButton
android:id="@+id/placas"
android:layout_width="88dp"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:text="PLACAS" />

<RadioButton
android:id="@+id/salir"
android:layout_width="88dp"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:text="SALIR" />
</RadioGroup>

Estas son las propiedades de nuestro botón.


El método Android:onClick nos ayuda para asignar el nombre del método que
utilizara nuestro botón al momento en que le demos click.
<Button
android:id="@+id/ok"
android:layout_width="wrap_content"
android:layout_height="39dp"
android:layout_gravity="center_horizontal"
android:gravity="center_horizontal"
android:onClick="seleccion"
android:text="OK" />

</LinearLayout>
</androidx.constraintlayout.widget.ConstraintLayout>

Este es el termino de nuestro .xml en el lado Text, ahora nos dirigimos a la clase
Menu.java en este espacio será donde vamos a programar todas las acciones y
eventos que van a tener los componentes que hemos colocado anteriormente.
5.- Código de la clase principal del menú.
Estas son las paqueterías que vamos a utilizar en nuestra aplicación.
package com.example.menu;

import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.content.pm.ActivityInfo;
import android.os.Bundle;
import android.view.View;
import android.widget.RadioButton;
import android.widget.Toast;

Declaramos cada componente y le asignamos un nombre para cada uno.

public class MainActivity extends AppCompatActivity {


private RadioButton rfc;
private RadioButton curp;
private RadioButton placas;
private RadioButton salir;

Igualamos los nombres a los componentes en el entorno gráfico.

El comando findViewById se utiliza para buscar y asociar cada componente que


está en el entorno gráfico.
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

rfc = (RadioButton) findViewById(R.id.rfc);


curp = (RadioButton) findViewById(R.id.curp);
placas = (RadioButton) findViewById(R.id.placas);
salir = (RadioButton) findViewById(R.id.salir);
}

Creamos el método que seguirá nuestro Boton se llama “selección”.


public void seleccion(View view) {

Metemos todo el método dentro de un


try{
} catch{
}

Esto para poner una excepción de error al no haber llenado correctamente todos
los campos disponibles.
try {
if (rfc.isChecked()) {
Intent intent = new Intent(view.getContext(), RFC.class);
startActivityForResult(intent, 0);
}

if (curp.isChecked()) {
Intent intent = new Intent(view.getContext(), CURP.class);
startActivityForResult(intent, 0);
}

if (placas.isChecked()) {
Intent intent = new Intent(view.getContext(), Placas.class);
startActivityForResult(intent, 0);
}

La idea del menú principal es seleccionar un RadioButton y después un botón de


aceptar el cual nos abrirá otra ventana que contenga dicha opción.

Para realizar esto, utilizaremos el método:


Intent intent = new Intent(view.getContext(), RFC.class);
startActivityForResult(intent, 0);

Estamos declarando la instrucción startActivityForResult para dirigir a la otra


ventana, en este caso nos dirige a RFC, ya que view.getContext() obtiene la
ventana actual.

Debemos meter estos llamados a cada clase dentro de condiciones tipo if

Y el método. isChecked nos hace referencia al RadioButton que este seleccionado

Así cada ventana tendrá su condición cada que sea pulsada.

Para la condición de salir, primero tendremos que crear una ventana y donde
colocaremos lo siguiente, nos ayudara a salir de la ventana actual y cerrar la
aplicación :
if (salir.isChecked()) {
finish();
Intent intent = new Intent(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_HOME);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
}

Cerramos el catch con el mensaje para que el usuario sepa que debe llenar todos
los campos antes de usar un botón.
} catch (Exception e) {
Toast.makeText(this, "Llena los datos", Toast.LENGTH_SHORT).show();
}
}
}
Activity RFC
Para la interfaz se siguió el siguiente procedimiento:

En esta ventana vamos a utilizar como anteriormente, un LinearLayout para darle


una estructura a nuestro diseño, dentro de él colocamos:
Usamos 4 TextView, en estos se muestra el título y las instrucciones, y el último
de ellos contendrá el resultado final que es el RFC.
Usamos 3 PlainText este componente sirve para que podamos introducir texto.
3 Spinner para seleccionar año, mes y dia.
Y finalmente tres botones, uno para mostrar RFC, otro para borrar y otro para
volver a nuestro menú principal.
6.- Código para los componentes de la interfaz RFC.
<?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=".RFC">
Al igual que en la pantalla pasada lo primero que hacemos es poner poner un
linear layout en este colocaremos los componentes que nos servirán en esta
ocasión.
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">

<LinearLayout
android:id="@+id/linearLayout"
android:layout_width="407dp"
android:layout_height="703dp"
android:orientation="vertical"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.428"
tools:layout_editor_absoluteX="2dp">

Utilizaremos el wrap_content para ajustar el tamaño al contenido de cada una de


nuestras etiquetas.

Lo que va variar es el id de cada componente y la orientación con el gravity

Los Edit text los usaremos para Nombre, apellido paterno y materno, tendrá una id,
posición y usaremos “hint” en el texto, esto sirve para poder ahorrar espacio, ya que
podemos poner la instrucción de los datos que se requieren y ya que se escribe
dentro las instrucciones desaparecen y solo se ve lo que el usuario escriba.

<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">

<TextView
android:id="@+id/textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:paddingBottom="10dp"
android:text="Mi RFC"
android:textSize="20sp" />

<TextView
android:id="@+id/tInstrucciones"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingBottom="20dp"
android:text="Instrucciones: Ingresa la información
solicitada" />

<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingBottom="10dp"
android:text="Nombre Completo:"
android:textSize="16sp" />

<EditText
android:id="@+id/cNombre"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:ems="10"
android:gravity="center"
android:hint="Nombre Completo"
android:inputType="textPersonName"
android:textSize="14sp" />

<EditText
android:id="@+id/cApellidop"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:ems="10"
android:gravity="center"
android:hint="Apellido paterno"
android:inputType="textPersonName"
android:textSize="14sp" />

<EditText
android:id="@+id/cApellidom"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:ems="10"
android:gravity="center"
android:hint="Apellido Materno"
android:inputType="textPersonName"
android:textSize="14sp" />

<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingTop="10dp"
android:paddingBottom="10dp"
android:text="Fecha de Nacimiento:"
android:textSize="16sp" />

</LinearLayout>

android:textSize="16sp" />

Como mejora de la primera versión de este menú, lo que ahora se hace es por
medio de spinners seleccionar, año, mes y día de nacimiento, por lo que
necesitamos de 3 linearlayout para ahorrar espacio en nuestra pantalla

También ponemos 3 textview una para cada número (año, mes, día) y finalmente
3 spinner que corresponden a los mismos 3 datos solicitados.

<LinearLayout
android:layout_width="381dp"
android:layout_height="29dp"
android:orientation="horizontal">

<TextView
android:id="@+id/textView4"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="Año" />

<TextView
android:id="@+id/textView5"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="Mes" />

<TextView
android:id="@+id/textView6"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="Día" />
</LinearLayout>

<LinearLayout
android:layout_width="380dp"
android:layout_height="wrap_content"
android:orientation="horizontal">

<Spinner
android:id="@+id/spinnerAnio"
android:layout_width="118dp"
android:layout_height="match_parent" />

<Spinner
android:id="@+id/spinnerMes"
android:layout_width="129dp"
android:layout_height="wrap_content" />

<Spinner
android:id="@+id/spinnerDia"
android:layout_width="129dp"
android:layout_height="wrap_content"
android:layout_weight="1" />

</LinearLayout>

<LinearLayout
android:layout_width="383dp"
android:layout_height="wrap_content"
android:orientation="horizontal">

<TextView
android:id="@+id/textViewAnio"
android:layout_width="47dp"
android:layout_height="match_parent"
android:layout_weight="1" />

<TextView
android:id="@+id/textViewMes"
android:layout_width="48dp"
android:layout_height="match_parent"
android:layout_weight="1" />

<TextView
android:id="@+id/textViewDia"
android:layout_width="86dp"
android:layout_height="wrap_content"
android:layout_weight="1" />
</LinearLayout>

Cada botón tendrá su propio contenido, orientación y texto a mostrar, solo varia el
comando onClick en donde ponemos los métodos que van a ejecutrar.
Le ponemos el método de borrar onClick para el método que se usará
<Button
android:id="@+id/button3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:onClick="borrar"
android:text="Borrar" />

Le ponemos el método de miRFC onClick para el método que se usará.

<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:onClick="miRFC"
android:text="Mostrar RFC" />

<TextView
android:id="@+id/rfc"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:paddingTop="5dp"
android:text="RFC:" />

Le ponemos el método de atras onClick para el método que se usará.

<Button
android:id="@+id/button4"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:onClick="atras"
android:text="Volver" />
</LinearLayout>

</androidx.constraintlayout.widget.ConstraintLayout>
</androidx.constraintlayout.widget.ConstraintLayout>

Hasta aquí es la parte gráfica, ahora lo siguiente es ir al archivo java en esta


ocasión el RFC para programarlo.
7.- Código de la clase RFC.
package com.example.menu;

Librerías a utilizar en la clase RFC.

import androidx.appcompat.app.AppCompatActivity;

import android.content.Intent;
import android.content.pm.ActivityInfo;
import android.os.Bundle;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.EditText;
import android.widget.Spinner;
import android.widget.TextView;
import android.widget.Toast;

import java.util.ArrayList;

Declaramos cada uno de los componentes que vamos a utilizar en nuestra clase.

Lo nuevo de aquí son los Spinner, los ArrayList y de igual manera los
ArrayAdapter que utilizaremos.

public class RFC extends AppCompatActivity {


EditText cNombre;
EditText cApellidop;
EditText cApellidom;
TextView trfc;
Spinner SpAnio, SpMes, SpDia;
TextView TvAnio, TvMes, TvDia;
ArrayList arrayListAnio = new ArrayList();
ArrayAdapter Adaptador;
ArrayList arrayListMes = new ArrayList();
ArrayAdapter Adaptador2;
ArrayList arrayListDia = new ArrayList();
ArrayAdapter Adaptador3;

Le asignamos una variable a cada componente.

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_rfc);
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

cNombre = (EditText) findViewById(R.id.cNombre);


cApellidop = (EditText) findViewById(R.id.cApellidop);
cApellidom = (EditText) findViewById(R.id.cApellidom);
trfc = (TextView) findViewById(R.id.rfc);
SpAnio=(Spinner)findViewById(R.id.spinnerAnio);
SpMes=(Spinner)findViewById(R.id.spinnerMes);
SpDia=(Spinner)findViewById(R.id.spinnerDia);
TvAnio=(TextView)findViewById(R.id.textViewAnio);
TvMes=(TextView)findViewById(R.id.textViewMes);
TvDia=(TextView)findViewById(R.id.textViewDia);

Creamos un for que vaya decrementando en una unidad el año actual 2020, hasta
el número que queramos en este caso 1940, esto para llenar el spinner de años.

Se asigna a un Adapter para que en el spinner aparezcan los años.

for(int i = 2020; i>=1940;i--)


{
arrayListAnio.add(i+"");
}
Adaptador=new ArrayAdapter(getBaseContext(),
android.R.layout.simple_spinner_item, arrayListAnio);
SpAnio = (Spinner)findViewById(R.id.spinnerAnio);
SpAnio.setAdapter(Adaptador);

Creamos un for que vaya decrementando en una unidad los meses del año del 12
al 1, esto para llenar el spinner de meses.

Se asigna a un Adapter para que en el spinner aparezcan los meses.

for(int i = 12; i>0;i--)


{
arrayListMes.add(i+"");
}
Adaptador2=new ArrayAdapter(getBaseContext(),
android.R.layout.simple_spinner_item, arrayListMes);
SpMes = (Spinner)findViewById(R.id.spinnerMes);
SpMes.setAdapter(Adaptador2);

Por último, creamos un for que vaya decrementando en una unidad los dias de un
mes del 31 al 1, esto para llenar el spinner de días.

Se asigna a un Adapter para que en el spinner aparezcan los días.

for(int i = 31; i>0;i--)


{
arrayListDia.add(i+"");
}
Adaptador3=new ArrayAdapter(getBaseContext(),
android.R.layout.simple_spinner_item, arrayListDia);
SpDia = (Spinner)findViewById(R.id.spinnerDia);
SpDia.setAdapter(Adaptador3);
}

El método RFC será el que vamos a utilizar en nuestra aplicación.


public void miRFC(View view) {
try {

Variable a la que se asignara RFC


String rfc = "";

Variable destinada a guardar Strings por ejemplo las vocales y consonantes que
se necesitan para un RFC.
String vocal = "";

Anexo de la primera letra del EditText apellido paterno


Por medio de un substring extraemos la primera letra, al mismo tiempo la
convertimos a mayúscula por el formato que debe tener un RFC.
Siempre que se realiza un proceso se concatena el resultado a la variable rfc.
rfc += cApellidop.getText().toString().substring(0, 1).toUpperCase();

Para obtener la primera vocal lo que utilizamos es un for para ir recorriendo


carácter por carácter nuestro String. Para buscar la primera vocal.

Usaremos también if para comparar si el carácter en cuestión es una vocal o no lo


es.

Si la variable es una vocal se concatena a la variable rfc, (esta variable ira


concatenando todos los caracteres necesarios para un RFC.

for (int i = 1; i < (cApellidop.getText().toString().length() - 1); i++)


{
//extrae cada una de las letras
vocal = cApellidop.getText().toString().substring(i, i +
1).toUpperCase();
//La condicion identifica si el valor de la variable "vocal" es una
vocal
if (vocal.equals("A") || vocal.equals("E") || vocal.equals("I") ||
vocal.equals("O") || vocal.equals("U")) {
//Si la condicion n es verdadera la vocal es asignada a la
variable rfc
rfc += vocal;
//El ciclo se rompe
break;
}
}

Anexo de la primer letra del EditText apellido materno y la primer letra del Nombre
pasándolas a mayúscula de igual manera.

Se concatena con la variable rfc.

//Anexo de la primer letra del EditText apellido materno


rfc += cApellidom.getText().toString().substring(0, 1).toUpperCase();
//Anexo de la primer letra del EdiText nombre
rfc += cNombre.getText().toString().substring(0, 1).toUpperCase();

Se concatena a cada etiqueta su respectivo valor en el spinner seleccionado, cada


TextView tendrá su propio valor que se presentara son el método setText para
obtener el valor que se quedó seleccionado.

TvAnio.setText(SpAnio.getSelectedItem() + "");
TvMes.setText(SpMes.getSelectedItem() + "");
TvDia.setText(SpDia.getSelectedItem() + "");
Anexo de los dos dígitos del año, en este caso se pide en formato de los últimos
dos dígitos, por lo que solamente se concatena este resultado a la variable rfc.

El año es extraido después de la selección en el spinner y su almacenamiento en


un textview.
//Anexamos los digitos del año
rfc+=Integer.parseInt(TvAnio.getText().toString().substring(2,3));
rfc+=Integer.parseInt(TvAnio.getText().toString().substring(3,4));

Aquí comprobamos que el mes si tiene solo 1 digito se le anexa un cero al inicio, si
no es de 1 digito no se agrega nada y solo se concatena a la variable rfc.

De igual menra se obtiene directamente del spinner que fue seleccionado.

//Anexamos el mes seleccionado


if (TvMes.getText().toString().length() < 2) {
//Si es verdadero anexa un 0 al inicio
//Y despues se agrega a la variable rfc
rfc += "0" + TvMes.getText().toString();
} else {
//Si es falso se agrega a la variable rfc
rfc += TvMes.getText().toString();
}

El día de igual forma comprueba que si es un digito le anexamos un cero al incio.

//Anexamos el dia seleccionado


if (TvDia.getText().toString().length() < 2) {
//Si es verdadero anexa un 0 al inicio
//Y despues se agrega a la variable rfc
rfc += "0" + TvDia.getText().toString();
} else {
//Si es falso se agrega a la variable rfc
rfc += TvDia.getText().toString();
}

//Se establece el texto de la variable "rfc" al objeto rfc


trfc.setText("RFC:" + rfc);

Después de haber hecho todos los procesos se asigna el texto de la variable rfc a
la etiqueta trfc.
//Se establece el texto de la variable "rfc" al objeto rfc
trfc.setText("RFC:" + rfc);
}catch (Exception e){
Toast.makeText(this, "Llena los datos", Toast.LENGTH_SHORT).show();
}
}

El método borrar lo utilizamos para que todos los editText se borre el contenido y
sea más sencillo consultar otro RFC.
public void borrar(View view) {
cNombre.setText("");
cApellidop.setText("");
cApellidom.setText("");
TvAnio.setText("");
TvMes.setText("");
TvDia.setText("");
trfc.setText("RFC:");
}

Enlace al botón volver para dirigirse al menú principal.

public void atras(View view) {


Intent intent2 = new Intent(view.getContext(),MainActivity.class);
startActivityForResult(intent2,0);
}
}
Activity CURP
Para la interfaz se siguió el siguiente procedimiento:

En esta ventana vamos a utilizar como anteriormente, un LinearLayout para darle


una estructura a nuestro diseño, dentro de él colocamos:
Usamos 7 TextView, en estos se muestra el título y las instrucciones, y el último
de ellos contendrá el resultado final que es el CURP.
Usamos 6 PlainText este componente sirve para que podamos introducir texto.
Usamos 2 RadioButton y un RadioGroup.
Ademas de 4 Spinner.
Como mejora de esta práctica de igual manera se utilizaron 3 spinner para la
fecha que se estará manejando.
Y finalmente tres botones, uno para mostrar CURP otro para borrar y otro para
volver a nuestro menú principal.
8.- Código para los componentes de la interfaz CURP.
<?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=".CURP">

De igual manera utilizamos primero un linear layout para aquí poner los
componentes que son los botones y los textos.
<LinearLayout
android:layout_width="413dp"
android:layout_height="732dp"
android:orientation="vertical"
tools:layout_editor_absoluteX="0dp"
tools:layout_editor_absoluteY="2dp">

 Con el wrap content acomodamos el largo del componente a cada texto


disponible.

 Cada uno debe tener un id que lo diferencie.

 El gravity también diferenciara a cada componente.

Código de las etiquetas TextView se le coloca el nombre que llevara, título, y


la posición.

<TextView
android:id="@+id/textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:paddingBottom="10dp"
android:text="Mi CURP"
android:textSize="12sp" />

<TextView
android:id="@+id/tInstrucciones"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingBottom="18dp"
android:text="Instrucciones: Ingresa la información solicitada"
android:textSize="12sp" />

<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingBottom="8dp"
android:text="Nombre Completo:"
android:textSize="10sp" />

Los Edit text los usaremos para Nombre, apellido paterno, apellido materno, año,
mes, día tendrá una id, posición y usaremos “hint” en el texto, esto sirve para poder
ahorrar espacio, ya que podemos poner la instrucción de los datos que se requieren
y ya que se escribe dentro las instrucciones desaparecen y solo se ve lo que el
usuario escriba.
<EditText
android:id="@+id/cNombre"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:ems="10"
android:gravity="center"
android:hint="Nombre Completo"
android:inputType="textPersonName"
android:textSize="12sp" />

<EditText
android:id="@+id/cApellidop"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:ems="10"
android:gravity="center"
android:hint="Apellido paterno"
android:inputType="textPersonName"
android:textSize="12sp" />

<EditText
android:id="@+id/cApellidom"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:ems="10"
android:gravity="center"
android:hint="Apellido Materno"
android:inputType="textPersonName"
android:textSize="12sp" />

<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingTop="8dp"
android:paddingBottom="8dp"
android:text="Fecha de Nacimiento:"
android:textSize="10sp" />

Como mejora de la primera versión de este menú, lo que ahora se hace es por
medio de spinners seleccionar, año, mes y día de nacimiento, por lo que
necesitamos de 3 linearlayout para ahorrar espacio en nuestra pantalla

También ponemos 3 textview una para cada número (año, mes, día) y finalmente
3 spinner que corresponden a los mismos 3 datos solicitados.

<LinearLayout
android:layout_width="381dp"
android:layout_height="29dp"
android:orientation="horizontal">

<TextView
android:id="@+id/textView4"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="Año" />

<TextView
android:id="@+id/textView5"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="Mes" />

<TextView
android:id="@+id/textView6"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="Día" />
</LinearLayout>

<LinearLayout
android:layout_width="380dp"
android:layout_height="wrap_content"
android:orientation="horizontal">

<Spinner
android:id="@+id/spinnerAnio"
android:layout_width="118dp"
android:layout_height="match_parent" />

<Spinner
android:id="@+id/spinnerMes"
android:layout_width="129dp"
android:layout_height="wrap_content" />

<Spinner
android:id="@+id/spinnerDia"
android:layout_width="129dp"
android:layout_height="wrap_content"
android:layout_weight="1" />

</LinearLayout>

<LinearLayout
android:layout_width="383dp"
android:layout_height="wrap_content"
android:orientation="horizontal">

<TextView
android:id="@+id/textViewAnio"
android:layout_width="47dp"
android:layout_height="match_parent"
android:layout_weight="1" />

<TextView
android:id="@+id/textViewMes"
android:layout_width="48dp"
android:layout_height="match_parent"
android:layout_weight="1" />

<TextView
android:id="@+id/textViewDia"
android:layout_width="86dp"
android:layout_height="wrap_content"
android:layout_weight="1" />
</LinearLayout>

<TextView
android:id="@+id/textView2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingTop="8dp"
android:paddingBottom="8dp"
android:text="Sexo:"
android:textSize="10sp" />

Colocamos un radio group con dos radiobutton que nos servirá para especificar el
sexo de la persona.

<RadioGroup
android:id="@+id/opciones"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:orientation="horizontal">

<RadioButton
android:id="@+id/radio_masculino"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:checked="true"
android:text="Masculino"
android:textSize="12sp" />

<RadioButton
android:id="@+id/radio_femenino"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:checked="false"
android:text="Femenino"
android:textSize="12sp" />
</RadioGroup>

<TextView
android:id="@+id/textView3"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingTop="8dp"
android:paddingBottom="8dp"
android:text="Seleccione su entidad de nacimiento:"
android:textSize="10sp" />

Para seleccionar la entidad de nacimiento utilizaremos un spinner que nos servirá


para elegir cada uno de los estados de México.

<Spinner
android:id="@+id/lista"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:text="" />

Le asignaremos el método miCURP para imprimir el resultado de cada persona

<Button
android:layout_width="wrap_content"
android:layout_height="39dp"
android:layout_gravity="center_horizontal"
android:onClick="miCURP"
android:text="Mostrar CURP"
android:textSize="12sp" />

Le ponemos el método Borrar para limpiar todos los contenidos.


<Button
android:layout_width="wrap_content"
android:layout_height="39dp"
android:layout_gravity="center_horizontal"
android:onClick="borrar"
android:text="Borrar"
android:textSize="12sp" />

Aquí se mostrará el CURP:


<TextView
android:id="@+id/curp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:paddingTop="5dp"
android:text="CURP:" />

Le ponemos el método de borrar onClick

<Button
android:id="@+id/button2"
android:layout_width="wrap_content"
android:layout_height="39dp"
android:layout_gravity="center_horizontal"
android:onClick="atras"
android:text="Volver"
android:textSize="12sp" />
Cerramos el linear layout que usaremos
</LinearLayout>
</androidx.constraintlayout.widget.ConstraintLayout>

Hasta aquí es la parte gráfica, ahora lo siguiente es ir al archivo java en esta


ocasión el CURP para programarlo.
9.- Código de la clase CURP.
Estas son las paqueterías que utilizaremos.
package com.example.menu;

import androidx.appcompat.app.AppCompatActivity;

import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.EditText;
import android.widget.RadioGroup;
import android.widget.Spinner;
import android.widget.TextView;
import android.widget.Toast;

import java.util.ArrayList;

A cada componente se le asocia con una variable declarada anteriormente.

Declaramos cada uno de los componentes que vamos a utilizar en nuestra clase.

Lo nuevo de aquí son los Spinner, los ArrayList y de igual manera los
ArrayAdapter que utilizaremos
public class CURP extends AppCompatActivity {
EditText cNombre;
EditText cApellidop;
EditText cApellidom;
TextView tcurp;
private RadioGroup grupo;
private Spinner spinner1;
Spinner SpAnio, SpMes, SpDia;
TextView TvAnio, TvMes, TvDia;
ArrayList arrayListAnio = new ArrayList();
ArrayAdapter Adaptador;
ArrayList arrayListMes = new ArrayList();
ArrayAdapter Adaptador2;
ArrayList arrayListDia = new ArrayList();
ArrayAdapter Adaptador3;

Igualamos la variable a su entorno gráfico.

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_curp);

cNombre = (EditText) findViewById(R.id.cNombre);


cApellidop = (EditText) findViewById(R.id.cApellidop);
cApellidom = (EditText) findViewById(R.id.cApellidom);
tcurp = (TextView) findViewById(R.id.curp);
grupo = (RadioGroup) findViewById(R.id.opciones);
spinner1=(Spinner)findViewById(R.id.lista);
SpAnio=(Spinner)findViewById(R.id.spinnerAnio);
SpMes=(Spinner)findViewById(R.id.spinnerMes);
SpDia=(Spinner)findViewById(R.id.spinnerDia);
TvAnio=(TextView)findViewById(R.id.textViewAnio);
TvMes=(TextView)findViewById(R.id.textViewMes);
TvDia=(TextView)findViewById(R.id.textViewDia);

En el CURP lo que agregamos es la entidad federativa de cada persona, por lo


que necesitamos un arreglo para guardar cada uno de los estados que
utilizaremos para las entidades federativas y así hacer más rápido el proceso.

En el arreglo se coloca cada uno de los estados de Mexico, ya que cada uno
tendrá una clava con la cual se va identificar.
String[] estados = {"AGUASCALIENTES","BAJA CALIFORNIA","BAJA CALIFORNIA
SUR","CAMPECHE","COAHUILA"
,"COLIMA","CHIAPAS","CHIHUAHUA","DISTRITO
FEDERAL","DURANGO","GUANAJUATO","GUERRERO","HIDALGO","JALISCO",
"MÉXICO","MICHOACÁN","MORELOS","NAYARIT","NUEVO
LEÓN","OAXACA","PUEBLA","QUERÉTARO","QUINTANA ROO",
"SAN LUIS
POTOSÍ","SINALOA","SONORA","TABASCO","TAMAULIPAS","TLAXCALA","VERACRUZ","YUCATÁN"
,"ZACATECAS"
,"NACIDO EN EL EXTRANJERO"};

Creamos un for que vaya decrementando en una unidad el año actual 2020, hasta
el número que queramos en este caso 1940, esto para llenar el spinner de años.

Se asigna a un Adapter para que en el spinner aparezcan los años.

ArrayAdapter<String> adapter = new ArrayAdapter<String>


( this,android.R.layout.simple_dropdown_item_1line,estados );
spinner1.setAdapter(adapter);

for(int i = 2020; i>=1940;i--)


{
arrayListAnio.add(i+"");
}
Adaptador=new ArrayAdapter(getBaseContext(),
android.R.layout.simple_spinner_item, arrayListAnio);
SpAnio = (Spinner)findViewById(R.id.spinnerAnio);
SpAnio.setAdapter(Adaptador);

Creamos un for que vaya decrementando en una unidad los meses del año del 12
al 1, esto para llenar el spinner de meses.

Se asigna a un Adapter para que en el spinner aparezcan los meses.

for(int i = 12; i>0;i--)


{
arrayListMes.add(i+"");
}
Adaptador2=new ArrayAdapter(getBaseContext(),
android.R.layout.simple_spinner_item, arrayListMes);
SpMes = (Spinner)findViewById(R.id.spinnerMes);
SpMes.setAdapter(Adaptador2);

Por último, creamos un for que vaya decrementando en una unidad los dias de un
mes del 31 al 1, esto para llenar el spinner de días.

Se asigna a un Adapter para que en el spinner aparezcan los días.

for(int i = 31; i>0;i--)


{
arrayListDia.add(i+"");
}
Adaptador3=new ArrayAdapter(getBaseContext(),
android.R.layout.simple_spinner_item, arrayListDia);
SpDia = (Spinner)findViewById(R.id.spinnerDia);
SpDia.setAdapter(Adaptador3);
}

Iniciamos el método para el curp.

Usaremos un String curp para guardar el resultado del usuario

Usaremos un String vocal para guardar Strings que se irán necesitando para
conformar el CURP
El String selección es para almacenar lo que se elija del spinner

//Creacion del metodo que calcula RFC


public void miCURP(View view) {
try {
//Variable a la que se asignara RFC
String curp = "";
//variable destinada a la primera vocal del apellido paterno
String vocal = "";
//almacena seleccion del spinner
String seleccion = spinner1.getSelectedItem().toString();

Anexamos la primera letra del apellido paterno y se pasa a mayúscula.


//anexo de la primera letra del EditText apellido paterno
curp += cApellidop.getText().toString().substring(0,
1).toUpperCase();

Obtenemos la primera vocal del apellido paterno


Con ayuda de un ciclo for para ir recorriendo la cadena

Se utiliza la condición if para comparar el digito e identificar si es una vocal o no lo


es, en caso de ser vocar se asigna su valor a la variable curp.
//ciclo que recorre la cadena de apellido paterno en busca de la
primera vocal
for (int i = 1; i < (cApellidop.getText().toString().length() - 1);
i++) {
//extrae cada una de las letras
vocal = cApellidop.getText().toString().substring(i, i +
1).toUpperCase();
//La condicion identifica si el valor de la variable "vocal" es
una vocal
if (vocal.equals("A") || vocal.equals("E") || vocal.equals("I")
|| vocal.equals("O") || vocal.equals("U")) {
//Si la condicion n es verdadera la vocal es asignada a la
variable rfc
curp += vocal;
//El ciclo se rompe
break;
}
}
Se obtiene la primera letra del apellido paterno, se pasa a mayúsculas y se asigna
su valor a la variable curp
//Anexo de la primer letra del EditText apellido materno
curp += cApellidom.getText().toString().substring(0,
1).toUpperCase();

Se obtiene la primera letra del nombre, se pasa a mayúsculas y se asigna su valor


a la variable curp
//Anexo de la primer letra del EdiText nombre
curp += cNombre.getText().toString().substring(0, 1).toUpperCase();

Se concatena a cada etiqueta su respectivo valor en el spinner seleccionado, cada


TextView tendrá su propio valor que se presentara son el método setText para
obtener el valor que se quedó seleccionado.

TvAnio.setText(SpAnio.getSelectedItem() + "");
TvMes.setText(SpMes.getSelectedItem() + "");
TvDia.setText(SpDia.getSelectedItem() + "");

Anexo de los dos dígitos del año, en este caso se pide en formato de los últimos
dos dígitos, por lo que solamente se concatena este resultado a la variable rfc.

El año es extraido después de la selección en el spinner y su almacenamiento en


un textview.
//Anexamos los digitos del año
curp+=Integer.parseInt(TvAnio.getText().toString().substring(2,3));
curp+=Integer.parseInt(TvAnio.getText().toString().substring(3,4));

Aquí comprobamos que el mes si tiene solo 1 digito se le anexa un cero al inicio, si
no es de 1 digito no se agrega nada y solo se concatena a la variable rfc.

De igual menra se obtiene directamente del spinner que fue seleccionado.

//Anexamos el mes seleccionado


if (TvMes.getText().toString().length() < 2) {
//Si es verdadero anexa un 0 al inicio
//Y despues se agrega a la variable rfc
curp += "0" + TvMes.getText().toString();
} else {
//Si es falso se agrega a la variable rfc
curp += TvMes.getText().toString();
}

El día de igual forma comprueba que si es un digito le anexamos un cero al incio.

//Anexamos el dia seleccionado


if (TvDia.getText().toString().length() < 2) {
//Si es verdadero anexa un 0 al inicio
//Y despues se agrega a la variable rfc

v
curp += "0" + TvDia.getText().toString();
} else {
//Si es falso se agrega a la variable rfc
curp += TvDia.getText().toString();
}

Elegimos el sexo de la persona con if y else una condición en donde si esta


seleccionado el RadioButton mujer, se concatena una letra M, en el otro caso si
este seleccionado hombre se concatena una letra H.

if (grupo.getCheckedRadioButtonId() == R.id.radio_masculino) {
curp += "H";
} else {
curp += "M";
}

Comprobamos todos los estados de la república, para seleccionar la entidad


federativa, se hace uso de una condiciónvif de acuerdo a un estado será la
abreviación que se asignara a la variable rfc.
if (seleccion.equals("AGUASCALIENTES")) {
curp += "AS";
} else if (seleccion.equals("BAJA CALIFORNIA")) {
curp += "BC";
} else if (seleccion.equals("BAJA CALIFORNIA SUR")) {
curp += "BS";
} else if (seleccion.equals("CAMPECHE")) {
curp += "CC";
} else if (seleccion.equals("COAHUILA")) {
curp += "CL";
} else if (seleccion.equals("COLIMA")) {
curp += "CM";
} else if (seleccion.equals("CHIAPAS")) {
curp += "CS";
} else if (seleccion.equals("CHIHUAHUA")) {
curp += "CH";
} else if (seleccion.equals("DISTRITO FEDERAL")) {
curp += "DF";
} else if (seleccion.equals("DURANGO")) {
curp += "DG";
} else if (seleccion.equals("GUANAJUATO")) {
curp += "GT";
} else if (seleccion.equals("GUERRERO")) {
curp += "GR";
} else if (seleccion.equals("HIDALGO")) {
curp += "HG";
} else if (seleccion.equals("JALISCO")) {
curp += "JC";
} else if (seleccion.equals("MÉXICO")) {
curp += "MC";
} else if (seleccion.equals("MICHOACÁN")) {
curp += "MN";
} else if (seleccion.equals("MORELOS")) {
curp += "MS";
} else if (seleccion.equals("NAYARIT")) {
curp += "NT";
} else if (seleccion.equals("NUEVO LEÓN")) {
curp += "NL";
} else if (seleccion.equals("OAXACA")) {
curp += "OC";
} else if (seleccion.equals("PUEBLA")) {
curp += "PL";
} else if (seleccion.equals("QUERÉTARO")) {
curp += "QT";
} else if (seleccion.equals("QUINTANA ROO")) {
curp += "QR";
} else if (seleccion.equals("SAN LUIS POTOSÍ")) {
curp += "SP";
} else if (seleccion.equals("SINALOA")) {
curp += "SL";
} else if (seleccion.equals("SONORA")) {
curp += "SR";
} else if (seleccion.equals("TABASCO")) {
curp += "TC";
} else if (seleccion.equals("TAMAULIPAS")) {
curp += "TS";
} else if (seleccion.equals("TLAXCALA")) {
curp += "TL";
} else if (seleccion.equals("VERACRUZ")) {
curp += "VZ";
} else if (seleccion.equals("YUCATÁN")) {
curp += "YN";
} else if (seleccion.equals("ZACATECAS")) {
curp += "ZS";
} else if (seleccion.equals("NACIDO EN EL EXTRANJERO")) {
curp += "NE";
}

Con este for se recorre la cadena del Apellido paterno, en busca de la consonante,
seleccionamos la condición en caso de que la letra del apellido paterno sea Ñ se
v
cambia por una X, si no es Ñ se asigna cualquier otro valor que se haya
encontrado y cumpla con la condición de ser consonante.
for (int i = 1; i < (cApellidop.getText().toString().length() - 1);
i++) {
vocal = cApellidop.getText().toString().substring(i, i +
1).toUpperCase();

if (vocal.equals("Ñ")) {
curp += "X";
} else if (vocal.equals("B") || vocal.equals("C") ||
vocal.equals("D") || vocal.equals("F")
|| vocal.equals("G") || vocal.equals("H") ||
vocal.equals("J") || vocal.equals("K")
|| vocal.equals("L") || vocal.equals("M") ||
vocal.equals("N") || vocal.equals("P")
|| vocal.equals("Q") || vocal.equals("R") ||
vocal.equals("S") || vocal.equals("T")
|| vocal.equals("V") || vocal.equals("W") ||
vocal.equals("X") || vocal.equals("Y")
|| vocal.equals("Z")) {
curp += vocal;
break;
}
}

Con este for se recorre la cadena del Apellido materno, en busca de la


consonante, seleccionamos la condición en caso de que la letra del apellido
paterno sea Ñ se cambia por una X, si nov es Ñ se asigna cualquier otro valor que
se haya encontrado y cumpla con la condición de ser consonante.
for (int i = 1; i < (cApellidom.getText().toString().length() - 1);
i++) {

vocal = cApellidom.getText().toString().substring(i, i +
1).toUpperCase();

if (vocal.equals("Ñ")) {
curp += "X";
} else if (vocal.equals("B") || vocal.equals("C") ||
vocal.equals("D")
|| vocal.equals("F") || vocal.equals("G") ||
vocal.equals("H")
|| vocal.equals("J") || vocal.equals("K") ||
vocal.equals("L")
|| vocal.equals("M") || vocal.equals("N") ||
vocal.equals("P")
|| vocal.equals("Q") || vocal.equals("R") ||
vocal.equals("S")
|| vocal.equals("T") || vocal.equals("V") ||
vocal.equals("W")
|| vocal.equals("X") || vocal.equals("Y") ||
vocal.equals("Z")) {

curp += vocal;

break;
}
}

Con este for se recorre la cadena del Nombre, en busca de la consonante,


seleccionamos la condición en caso de que la letra del apellido paterno sea Ñ se
cambia por una X, si no es Ñ se asigna cualquier otro valor que se haya
encontrado y cumpla con la condición de ser consonante.

for (int i = 1; i < (cNombre.getText().toString().length() - 1); i++)


{

vocal = cNombre.getText().toString().substring(i, i +
1).toUpperCase();

if (vocal.equals("Ñ")) {
curp += "X";
} else if (vocal.equals("B") || vocal.equals("C") ||
vocal.equals("D")
|| vocal.equals("F") || vocal.equals("G") ||
vocal.equals("H")
|| vocal.equals("J") || vocal.equals("K") ||
vocal.equals("L")
|| vocal.equals("M") || vocal.equals("N") ||
vocal.equals("P")
|| vocal.equals("Q") || vocal.equals("R") ||
vocal.equals("S")
|| vocal.equals("T") || vocal.equals("V") ||
vocal.equals("W")
|| vocal.equals("X") || vocal.equals("Y") ||
vocal.equals("Z")) {

curp += vocal;
break;
}
}

Se establece el texto de la variable "rfc" al objeto rfc


tcurp.setText("CURP:" + curp);
} catch (Exception e) {
Toast.makeText(this, "Llena los datos", Toast.LENGTH_SHORT).show();
}
}

Método borrar para que cada componente se limpie para otra consulta.
public void borrar(View view) {
cNombre.setText("");
cApellidop.setText("");
cApellidom.setText("");
TvAnio.setText("");
TvMes.setText("");
TvDia.setText("");
tcurp.setText("CURP:");
}

Método para regresar al menú principal.


public void atras(View view) {
Intent intent2 = new Intent(view.getContext(),MainActivity.class);
startActivityForResult(intent2,0);
}
}
Hasta aquí es la parte gráfica, ahora lo siguiente es ir al archivo java en esta
ocasión Placas para programarlo.
Activity Placas
Para la interfaz se siguió el siguiente procedimiento:

En esta ventana vamos a utilizar como anteriormente, un LinearLayout para darle


una estructura a nuestro diseño, dentro de él colocamos:
Usamos 8 TextView, en estos se muestra el título y las instrucciones, y el último
de ellos contendrá el resultado final que es la Placa.
Usamos 3 PlainText este componente sirve para que podamos introducir texto.
Usaremos 2 Spinner, uno será para las marcas más famosas de autos, asi como
otro que será para el año del modelo del auto.
Usamos 2 RadioButton y un RadioGroup.
Y finalmente 3 botones, uno para mostrar Placa otro para borrar y otro para volver
a nuestro menú principal.
9.- Código para los componentes de la interfaz Placas.
<?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=".Placas">

Utilizamos un linear layout que se usara para colocar todos los componentes.
<LinearLayout
android:layout_width="407dp"
android:layout_height="628dp"
android:orientation="vertical"
app:layout_constraintBottom_toBottomOf="parent"
tools:layout_editor_absoluteX="0dp">

 Con el wrap content acomodamos el largo del componente a cada texto


disponible.

 Cada uno debe tener un id que lo diferencie.

 El gravity también diferenciara a cada componente.

Código de las etiquetas TextView se le coloca el nombre que llevara, título, y


la posición.
<TextView
android:id="@+id/textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:paddingBottom="10dp"
android:text="Placas"
android:textSize="16sp" />

<TextView
android:id="@+id/tInstrucciones"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingBottom="18dp"
android:text="Instrucciones: Ingresa la información solicitada" />

<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingBottom="8dp"
android:text="Nombre Completo:"
android:textSize="14sp" />

Los Edit text los usaremos para Nombre, apellido paterno, apellido materno, año,
mes, día tendrá una id, posición y usaremos “hint” en el texto, esto sirve para poder
ahorrar espacio, ya que podemos poner la instrucción de los datos que se requieren
y ya que se escribe dentro las instrucciones desaparecen y solo se ve lo que el
usuario escriba.
<EditText
android:id="@+id/cNombre"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:ems="10"
android:gravity="center"
android:hint="Nombre Completo"
android:inputType="textPersonName"
android:textSize="12sp" />

<EditText
android:id="@+id/cApellidop"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:ems="10"
android:gravity="center"
android:hint="Apellido paterno"
android:inputType="textPersonName"
android:textSize="12sp" />

<EditText
android:id="@+id/cApellidom"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:ems="10"
android:gravity="center"
android:hint="Apellido Materno"
android:inputType="textPersonName"
android:textSize="10sp" />

<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingTop="8dp"
android:paddingBottom="8dp"
android:text="Datos del automóvil:"
android:textSize="10sp" />

<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingTop="8dp"
android:paddingBottom="8dp"
android:text="Año o modelo del Automóvil:"
android:textSize="10sp" />

Aquí se declara el spinner que será utilizado para poner los años de los modelos del
automóvil.
<Spinner
android:id="@+id/spinnerAnio"
android:layout_width="220dp"
android:layout_height="wrap_content"
android:layout_gravity="center" />

<TextView
android:id="@+id/textViewAnio"
android:layout_width="match_parent"
android:layout_height="wrap_content" />

<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingTop="8dp"
android:paddingBottom="8dp"
android:text="Marca del Auto:"
android:textSize="10sp" />

Aquí se declara el spinner que será utilizado para poner las marcas de los modelos
famosos de automóviles.
<Spinner
android:id="@+id/spinnerMarca"
android:layout_width="220dp"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:text="" />

<TextView
android:id="@+id/textViewMarca"
android:layout_width="match_parent"
android:layout_height="wrap_content" />

<TextView
android:id="@+id/textView2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingTop="8dp"
android:paddingBottom="8dp"
android:text="Lugar de Registro:"
android:textSize="10sp" />

RadioGroup que de acuerdo al OptionButton que sea seleccionado nos dirá si fue
registrado en el Estado de México o en la Ciudad de México.

<RadioGroup
android:id="@+id/opciones"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:orientation="horizontal">

<RadioButton
android:id="@+id/edo"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:checked="true"
android:text="Estado de México" />

<RadioButton
android:id="@+id/cdmx"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:checked="false"
android:text="Ciudad de México" />
</RadioGroup>

Se asignará el método miPlaca para mostrar la placa.


<Button
android:layout_width="wrap_content"
android:layout_height="39dp"
android:layout_gravity="center_horizontal"
android:onClick="miPlaca"
android:text="Mostrar Placa" />
Se asignará el método borrar.
<Button
android:layout_width="wrap_content"
android:layout_height="39dp"
android:layout_gravity="center_horizontal"
android:onClick="borrar"
android:text="Borrar" />

<TextView
android:id="@+id/placas"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:paddingTop="5dp"
android:text="Placa:" />

Método para regresar al menú principal.


<Button
android:id="@+id/volver"
android:layout_width="wrap_content"
android:layout_height="39dp"
android:layout_gravity="center_horizontal"
android:onClick="atras"
android:text="Volver" />

</LinearLayout>
</androidx.constraintlayout.widget.ConstraintLayout>

10.- Codigo clase Placas.


Librerías que se van a utilizar.

package com.example.menu;
import androidx.appcompat.app.AppCompatActivity;

import android.content.Intent;
import android.content.pm.ActivityInfo;
import android.os.Bundle;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.EditText;
import android.widget.RadioGroup;
import android.widget.Spinner;
import android.widget.TextView;
import android.widget.Toast;

import java.util.ArrayList;
Se declara cada variable a utilizar, con las mejoras de los Spinners.

public class Placas extends AppCompatActivity {

EditText cNombre;
EditText cApellidop;
EditText cApellidom;
EditText cMarca;
TextView tplacas;
private RadioGroup grupo;
Spinner SpAnio;
TextView TvAnio;
ArrayList arrayListAnio = new ArrayList();
ArrayAdapter Adaptador;
private Spinner SpMarca;
TextView TvMarca;

Se asigna cada variable al entorno gráfico.


@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_placas);
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

cNombre = (EditText) findViewById(R.id.cNombre);


cApellidop = (EditText) findViewById(R.id.cApellidop);
cApellidom = (EditText) findViewById(R.id.cApellidom);
tplacas = (TextView) findViewById(R.id.placas);
grupo = (RadioGroup) findViewById(R.id.opciones);
SpAnio=(Spinner)findViewById(R.id.spinnerAnio);
TvAnio=(TextView)findViewById(R.id.textViewAnio);
SpMarca=(Spinner)findViewById(R.id.spinnerMarca);
TvMarca=(TextView)findViewById(R.id.textViewMarca);

Se declara un arreglo donde se ponen las marcas mas famosas de autos, que se
usaran para poder obtener la placa.
String[] marcas = {"Kia","Lamborghini","Ferrari","Audi","Mercedes Benz"
,"Porsche","Toyota","Honda","Bugatti","Volkswagen","Ford","Aston
Martin","Maserati","Jaguar",
"Rolls
Royce","Chevrolet","Nissan","Bentley","Volvo","Mclaren","Lexus","Mazda","Cadillac
",
"Land
Rover","Mitsubishi","Mini","Renault","Hyundai","Jeep","Peugeot","Pagani","Dodge"
,"Hummer","Acura","Alfa
Romeo","Subaru","Shelby","Koenigsegg","Seat","Lotus","Suzuki",

"Citroen","Fiat","Opel","Chrysler","Daewoo","Lincoln","Skoda","Pontiac","Saleen",
"Isuzu",
"Buick","Chery","Ssan
Yong","Plymouth","Delorean","Mercury","Saturn"};

Con el adapter se asigna el arreglo a nuestro Spinner

ArrayAdapter<String> adapter = new


ArrayAdapter<>(this,android.R.layout.simple_dropdown_item_1line,marcas);
SpMarca.setAdapter(adapter);

Creamos un for que vaya decrementando en una unidad el año actual 2020, hasta
el número que queramos en este caso 1940, esto para llenar el spinner de años.

Se asigna a un Adapter para que en el spinner aparezcan los años.


for(int i = 2020; i>=1940;i--)
{
arrayListAnio.add(i+"");
}
Adaptador=new ArrayAdapter(getBaseContext(),
android.R.layout.simple_spinner_item, arrayListAnio);
SpAnio = (Spinner)findViewById(R.id.spinnerAnio);
SpAnio.setAdapter(Adaptador);

Se asignará el método miPlaca para mostrar la placa.


Con las variables a utilizar.

Usamos strings para almacenar los componentes de la placa, adicionalmente


ocuparemos algunas variables que nos van a servir como contadores para facilitar
la obtención de los caracteres que conforman la placa.
public void miPlaca(View view)
{
try {
//Variable a la que se asignara la placa

//variable destinada a la primera vocal del apellido paterno


String con1 ="";
String placa ="";
String vocal = "";
String letras="";
String numeros="";
int nconsonante=0;
int nvocal =0;

Se hace uso de un ciclo for para recorrer la cadena del nombre, como en el caso
del CURP y RFC, pero adicionalmente en este proceso de las placas, necesitamos
la segunda consonante y no la primera.

Por lo que con ayuda de un contador y de la condición if lo que hacemos es ir


almacenando las consonantes hasta que sea igual a dos, en ese momento se
rompe el ciclo y obtenemos la segunda consonante, de ahí la importancia de
nuestra variable que funciona como contador

//Segunda Consonante del nombre


for(int i =0; i< (cNombre.getText().toString().length()); i++){
con1 =
cNombre.getText().toString().substring(i,i+1).toUpperCase();
if (con1.equals("B") || con1.equals("C") || con1.equals("D")||
con1.equals("F") || con1.equals("G") ||
con1.equals("H")|| con1.equals("J") || con1.equals("K")
|| con1.equals("L")|| con1.equals("M") ||
con1.equals("N") || con1.equals("P")|| con1.equals("Q")
|| con1.equals("R") || con1.equals("S")
|| con1.equals("T") || con1.equals("V") ||
con1.equals("W")|| con1.equals("X") || con1.equals("Y") || con1.equals("Z")){
nconsonante++;

if(nconsonante==2){
letras += con1;
break;
}
}
}

Se hace uso de un ciclo for para recorrer la cadena del apellido paterno, como en
el caso del CURP y RFC, pero adicionalmente en este proceso de las placas,
necesitamos la segunda vocal y no la primera.

Por lo que con ayuda de un contador y de la condición if lo que hacemos es ir


almacenando las vocales hasta que sea igual a dos, en ese momento se rompe el
ciclo y obtenemos la segunda vocal, de ahí la importancia de nuestra variable que
funciona como contador
//Segunda Vocal del apelldio paterno
for (int i = 0; i < (cApellidop.getText().toString().length()); i++)
{
vocal = cApellidop.getText().toString().substring(i, i +
1).toUpperCase();
if (vocal.equals("A") || vocal.equals("E") || vocal.equals("I")
|| vocal.equals("O") || vocal.equals("U")) {
nvocal++;

if(nvocal==2){
letras += vocal;
break;
}

}
}
Ultima consonante, se recorre el String al revés, ya que ahora se necesita la ultima
consonante, el for va en decremento por eso el i - -

Lo que se hace es obtener la extensión de la palabra e ir restando uno a esa


posición para obtener la última consonante que se necesita para conformar las
placas.

//Ultima consonante del apellido materno


for(int i=(cApellidom.getText().toString().length());i>0;i--){
con1=cApellidom.getText().toString().substring(i-
1,i).toUpperCase();
if (con1.equals("B") || con1.equals("C") || con1.equals("D")||
con1.equals("F") || con1.equals("G") ||
con1.equals("H")|| con1.equals("J") || con1.equals("K") ||
con1.equals("L")|| con1.equals("M") ||
con1.equals("N") || con1.equals("P")|| con1.equals("Q") ||
con1.equals("R") || con1.equals("S")||
con1.equals("T") || con1.equals("V") || con1.equals("W")||
con1.equals("X") || con1.equals("Y") ||
con1.equals("Z")){

letras+=con1;
break;
}
}

Se suman los dígitos del año para obtener los últimos dos dígitos.
Lo que se hace es obtener el año completo, se va partiendo con ayuda de ir
sacando el módulo de 10, y dividir el numero entre 10, para ir obteniendo cada
digito.

Al mismo tiempo que se va haciendo la suma de estos digitos, es decir digito a


digito ir sumando los numero hasta terminar la cantidad, para esto es la condicion
while (mientras el numero sea mayor que cero).

Debemos considerar que, si la suma es menor a 9, le anexamos un 0 al inicio de


la cantidad.

TvAnio.setText(SpAnio.getSelectedItem() + "");
//Suma de los dos ultimos digitos del año
int año=0;
int numero;
numero=Integer.parseInt(TvAnio.getText().toString());
while(numero > 0) {
año += numero % 10;
numero = numero / 10;
}
if(año<=9) {
numeros += "0" + año;
}else{
numeros+=año;
}

Se obtiene la selección del spinner y se asigna a una variable de tipo text.

Se obtiene la posición de la primera vocal de la marca con un for y se obtiene la


posición comparándola con cada vocal.

En estos casos las posiciones de las cadenas debemos tener en consideración


que la posición inicial es la 0.

La posición la tomamos de nuestro iterador en el for, es decir la variable “i”.


TvMarca.setText(SpMarca.getSelectedItem() + "");
//Posición de la primera vocal de la marca
for (int i = 0; i < (TvMarca.getText().toString().length()); i+
+) {
vocal = TvMarca.getText().toString().substring(i, i +
1).toUpperCase();
if (vocal.equals("A") || vocal.equals("E") ||
vocal.equals("I")
|| vocal.equals("O") || vocal.equals("U")) {
numeros += i;
break;
}
}
Con las opciones en nuestro radiobutton tenemos las opciones por si se elige

CDMX primero se ponen los números anteriores y después las letras

Si se elige Estado de México primero debe empezar por las letras y después los
números.
if (grupo.getCheckedRadioButtonId() == R.id.cdmx) {
placa += numeros+letras;
} if (grupo.getCheckedRadioButtonId() == R.id.edo) {
placa += letras+numeros;
}

Concatenamos todas las variables anteriores a nuestro String placa.


tplacas.setText("Placa:" + placa);
}catch (Exception e){
Toast.makeText(this, "Llena los datos",
Toast.LENGTH_SHORT).show();
}
}

Nuestro método Borrar nos ayudara a limpiar cada campo de Texto.

public void borrar(View view) {


cNombre.setText("");
cApellidop.setText("");
cApellidom.setText("");
TvAnio.setText("");
TvMarca.setText("");
tplacas.setText("Placa:");
}

El método atrás nos ayuda a volver al menú principal.


public void atras(View view) {
Intent intent2 = new Intent(view.getContext(),MainActivity.class);
startActivityForResult(intent2,0);
}
}
Capturas de pantalla de la ejecución de la aplicación.
RFC
CURP
Placas
Salir

Вам также может понравиться