Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Bruno Palacios
Contenido
Clase 1: Introducción a JAVA y carga de Andorid.............................................................3
Clase 2: Estructura Proyecto Android y carga de Emuladores ......................................15
2.1 Como funciona un proyecto android ....................................................................16
2.2 Como Colocar un splash de inicio de proyecto: ...............................................27
a. Referenciar la actividad splash en la configuración del proyecto: ..............27
b. Crear la clase Java ....................................................................................................28
c. Definimos los valores globales del proyecto .......................................................29
d. Creación de los layout de la actividad ................................................................30
e. Creación de las imágenes .......................................................................................32
2.3 Creando un activity para bienvenida: ..................................................................34
a. Creación de la actividad ..........................................................................................34
b. Creación de valores globales .................................................................................37
c. Referenciar la actividad “bienvenido” en la configuración del proyecto: 37
d. Codificamos en la clase Java .................................................................................38
2.4 Creando un Login con motor SQLite: .....................................................................39
a. Configurando Gradle .................................................................................................40
b. Definimos los valores globales a emplear como strings, colors, styles ........41
c. Crear la clase para del objeto Usuario .................................................................42
d. Crear la clase para del objeto DatabaseHelper ................................................44
e. Crear la actividad para el Logeo ...........................................................................50
f. Crear la clase para validar datos ...........................................................................53
g. Crear la Actividad para Registrar datos de inicio de sesión ...........................56
h. Crear la clase para obtener datos de la BD ........................................................62
i. Crear la Actividad Listado de Usuarios .................................................................68
j. Colocamos código a la clase Java para el Logeo ...........................................72
k. Configuramos el proyecto ........................................................................................75
l. Adicionando un Item al Menú .................................................................................76
Clase 3: Referencias de controles y paquetes; Eventos en controles, reconstruir un
proyecto........................................................................................................................................77
Clase 4: Uso de GIT, componentes de Android. ................................................................79
4.1 Configurar cuenta de github: .................................................................................79
Tecnología Java, Tiene 3 plataformas: web, escritorio y móviles (esta última ya está
desfasada)
Se empleará la sintaxis de Java escritorio para android.
JVM-
La versión jdk 8 tiene Servicios Rest.
Paquete jar, contiene .class y .java; las class emplea código binario de aplicaciones java
mediante bytecode.
La versión más empleada de JDK es la 6.
2. PROGRAMACION
Crear comentarios:
// : 1 linea
/* */ : varias líneas
Identificadores de variables
Deben escribirse empezando solo con los caracteres _ y $
No deben emplearse palabras reservadas.
Separadores
Especifica hasta donde inicia y termina las linea e código, listado de variables.
Literales
Son los tipos de atributos
Operadores condicionales
? = entonces
: = else
USER GITHUB:
N° mobil
Android
Como ejemplo se muestra la forma en que un cliente solicitaría información de un producto a un proveedor de
servicios Web:
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<getProductDetails xmlns="http://warehouse.example.com/ws">
<productId>827635</productId>
</getProductDetails>
</soap:Body>
</soap:Envelope>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<getProductDetailsResponse xmlns="http://warehouse.example.com/ws">
<getProductDetailsResult>
<productName>Toptimate 3-Piece Set</productName>
<productId>827635</productId>
<description>3-Piece luggage set. Black Polyester.</description>
<price>96.50</price>
<inStock>true</inStock>
</getProductDetailsResult>
</getProductDetailsResponse>
</soap:Body>
</soap:Envelope>
Activiy = Pantalla
Intensiones = pasar datos de una pantalla a otra
Ejercicios de Android
COMPILAMOS EL APP
● Object-oriented programming
- El primer ide fue el eclipse + sdk android (pugin). (esta fuera de uso)
- Luego sale intellij el cual emplea las librerías Gradle, la cual gestiona los
recursos que se requiere para realizar los proyectos descargándolos.
-
1) manifiests:
archivo de manifiesto
de Android:
descripción de la
aplicación leída por
el motor de ejecución
de Android
2) java:
paquetes de código
fuente de Java
3) res — carpeta
que contiene
Recursos como (XML):
diseño, cadenas,
imágenes,
dimensiones, colores
...
4) build.gradle —
Pagina = layout
c. Rest : contiene los recursos así como las actividades contenidas del proyecto
manisfests
Activity.jar
// Log.<log-level>(TAG, "Message");
https://drive.google.com/drive/folders/1oWx5GP8rt-AMPJ7XloiZ0fJIqdCxh95t
Carpetas principales:
Al
Seleccionamos lo descargado
C:\Users\CENPRO-PC\AppData\Local\Android\system-images
Tarea 5.1 y 5.2 de la guía pdf: UNIT 1 Android Developer Fundamentals (V2)
Diseño y recursos
Ellos son las pantallas donde se programará, dentro de ellas se puede utilizar controles los
que son llamados vistas.
Teclas de acceso rápido: presionar control y clic sobre el nombre del archivo donde se
navegara.
What is the name of the layout file for the main activity?
● MainActivity.java
● activity_main.xml
Ejercicio pag. 33
Proyecto SEGSIL_MOVIL
Pass: 1 al 6
Ir a la carpeta manifest -> AndroidManifest.xml para colocar las líneas de código que
llaman al layout mediante un activity.
<activity
android:name=".SplashActivity"
android:label="@string/app_name"
android:screenOrientation="portrait"
android:theme="@style/AppTheme.NoActionBar">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
Crear el archivo de clase java SplashActivity .java y colocar su Código, este archivo debe
crearse en la carpeta: JAVA -> dominio_de_la_compañia_colocado
Opcionalmente el archivo creado puede estar dentro de otra carpeta, para definir ello
solo colocar un punto seguido del nombre de esta.
Copiamos el Código:
package pe.edu.unmsm.sistemas.segsil;
import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
//import com.google.firebase.auth.FirebaseAuth;
import java.util.Timer;
import java.util.TimerTask;
//import pe.edu.unmsm.sistemas.segsil.R;
/*
FirebaseAuth firebaseAuth = FirebaseAuth.getInstance();
if (firebaseAuth.getCurrentUser() != null){
Intent intent = new Intent(getApplicationContext(),BienvenidoActivity.class);
startActivity(intent);
finish();
}else{
TimerTask timerTask = new TimerTask() {
@Override
public void run() {
Intent intent = new Intent(getApplicationContext(),LoginActivity.class);
startActivity(intent);
finish();
}
};
Timer timer = new Timer();
timer.schedule(timerTask, tiempoEspera);
}
}
*/
}
Nota: en el ejemplo se adiciona las líneas de código para el empleo de base de datos firebase y un
activity para el login, puede comentarlos si no los empleará o continuar con la guía para su
desarrollo.
En la sub carpeta values contenida en la carpeta de recursos ―Res‖ contiene todas las
configuraciones de variables generales para su uso en el proyecto.
<style name="AppTheme.NoActionBar">
<item name="windowActionBar">false</item>
<item name="windowNoTitle">true</item>
</style>
dimensionar el tamaño del texto del nombre del titulo de la aplicación, para
ello agregar el siguiente código al archivo ―dimens.xml‖:
<dimen name="texto_medio">20sp</dimen>
Colocamos el código
<LinearLayout
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center">
<ImageView
android:layout_width="150dp"
android:layout_height="150dp"
android:src="@drawable/logo_escudo_unmsm"/>
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:textSize="@dimen/texto_medio"
android:textStyle="bold"
android:text="UNMSM- YBAÑEZ 2019"/>
</LinearLayout>
</LinearLayout>
import android.app.Activity;
import android.os.Bundle;
import android.widget.ImageView;
La forma clásica que Android maneja para agregar imágenes y permitirle que las
redimensione, esto con la opción activo de imágenes (image asset)
La configuración para el paquete de imágenes es de tipo ―action bar and tab icons‖
(barra de acción e iconos de pestañas)
a. Creación de la actividad
Creamos la actividad BienvenidoActivity, para ello clic derecho sobre la carpeta principal
del proyecto y creamos una actividad en blanco.
Colocamos el nombre de la actividad y se creará su layout, esta acción creará la clase java.
Esta acción crea 2 objetos, el layout .xml y el java . java, nótese que el nombre que le coloque a la
actividad será asignado al archivo Java, mientras que el nombre del layout será para el
propiamente dicho.
Para este ejemplo colocaremos una imagen de bienvenida, para ello descargar su imagen
previamente. Copiar su imagen y hacer clic sobre la carpeta drawable y pegar
Creamos el fondo de pantalla, adicionando un archivo de recurso de dibujo, clic derecho sobre la
carpeta drawable, llamado ―fondo_patanlla_bienvenida.xml‖
</item>
</layer-list>
<resources>
Ir a la carpeta manifest -> AndroidManifest.xml para colocar las líneas de código que
llaman al layout mediante un activity.
Dentro del tag Application después la actividad ―splash‖ colocar crear la actividad
bienvenidoActivity a la cual le añadiremos el tema creado en la sección creación de
valores globales.
finish();
}
};
Timer timer = new Timer();
timer.schedule(timerTask, tiempoEspera);
}
}
a. Configurando Gradle
Debemos configurar el gradle para que sepa que trabajaremos una aplicación
con SQLite. Abrir el archivo build.gradle (module:app) para adicionar los paquetes
que emplearemos y copiar el siguiente código:
dependencies {
classpath 'com.android.tools.build:gradle:3.2.1'
Nota: debe tomar en cuenta la versión que use del Android SDK Plataform- Tools
para evita error en la reconstrucción.
Nos dirigimos al tab Dependencias y clic en el signo más para buscar la dependencia, la ir
buscando mostrará las versiones disponibles de acuerdo al SDK instalado, seleccionamos
la que necesitamos y aceptamos.
Luego para que el Proyecto reconozca las líneas adicionadas hay que volver a
reconstruirlo.
En strings.xml, adicionamos:
//constantes
<string name="text_accounts">Todas las cuentas</string>
<string name="hint_name">Nombres</string>
<string name="hint_email">Email</string>
<string name="hint_password">contraseña</string>
<string name="error_message_password">Ingrese contraseña</string>
<string name="hint_confirm_password">Confirmar contraseña</string>
<string name="error_password_match">La contraseña no coincide</string>
<string name="action_settings">Settings</string>
<string name="text_hello">Hola,</string>
<string name="text_title">Validación de Acceso</string>
<string name="action_lista_usuarios">Listar usuarios</string>
En colors.xml, adicionamos:
// colores adicionales
<color name="colorBackground">#FBE39D</color>
<color name="colorText">#A49E9E</color>
<color name="colorTextHint">#CE2B27</color>
Para organizar las clases creamos un paquete llamado ―model‖ clic derecho sobre la
carpeta java/tudominio y nuevo package:
Ahora creamos la clase dentro de este paquete, clic derecho sobre la carpeta (paquete)
creada y nueva clase java, la cual se llamará User,
Esta clase nos permite realizar los comandos de base de datos. Para organizar las clases
creamos un paquete llamado ―sql‖ clic derecho sobre la carpeta java/tudominio y nuevo
package:
Ahora creamos la clase dentro de este paquete, clic derecho sobre la carpeta (paquete)
creada y nueva clase java, la cual se llamará DatabaseHelper
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
// tenga en cuenta que en cambiar el dominio de acuerdo al nombre que coloc al crear la app
import com.example.android.pets.model.User;
import java.util.ArrayList;
import java.util.List;
// Database Version
private static final int DATABASE_VERSION = 1;
// Database Name
private static final String DATABASE_NAME = "UserManager.db";
/**
* Constructor
*
* @param context
*/
public DatabaseHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(CREATE_USER_TABLE);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
/**
* This method is to create user record
*
* @param user
*/
public void addUser(User user) {
SQLiteDatabase db = this.getWritableDatabase();
// Inserting Row
db.insert(TABLE_USER, null, values);
db.close();
}
/**
* This method is to fetch all user and return the list of user records
*
* @return list
*/
public List<User> getAllUser() {
// array of columns to fetch
String[] columns = {
COLUMN_USER_ID,
COLUMN_USER_EMAIL,
COLUMN_USER_NAME,
COLUMN_USER_PASSWORD
};
// sorting orders
String sortOrder =
COLUMN_USER_NAME + " ASC";
List<User> userList = new ArrayList<User>();
SQLiteDatabase db = this.getReadableDatabase();
do {
User user = new User();
user.setId(Integer.parseInt(cursor.getString(cursor.getColumnIndex(COLUMN_USER_ID))));
user.setName(cursor.getString(cursor.getColumnIndex(COLUMN_USER_NAME)));
user.setEmail(cursor.getString(cursor.getColumnIndex(COLUMN_USER_EMAIL)));
user.setPassword(cursor.getString(cursor.getColumnIndex(COLUMN_USER_PASSWORD)));
// Adding user record to list
userList.add(user);
} while (cursor.moveToNext());
}
cursor.close();
db.close();
/**
* This method to update user record
*
* @param user
*/
public void updateUser(User user) {
SQLiteDatabase db = this.getWritableDatabase();
// updating row
db.update(TABLE_USER, values, COLUMN_USER_ID + " = ?",
new String[]{String.valueOf(user.getId())});
db.close();
}
/**
* This method is to delete user record
*
* @param user
*/
public void deleteUser(User user) {
SQLiteDatabase db = this.getWritableDatabase();
// delete user record by id
db.delete(TABLE_USER, COLUMN_USER_ID + " = ?",
new String[]{String.valueOf(user.getId())});
db.close();
}
/**
* This method to check user exist or not
*
* @param email
* @return true/false
*/
public boolean checkUser(String email) {
String[] columns = {
COLUMN_USER_ID
};
SQLiteDatabase db = this.getReadableDatabase();
// selection criteria
String selection = COLUMN_USER_EMAIL + " = ?";
// selection argument
String[] selectionArgs = {email};
if (cursorCount > 0) {
return true;
}
return false;
}
/**
* This method to check user exist or not
*
* @param email
* @param password
* @return true/false
*/
public boolean checkUser(String email, String password) {
// selection arguments
String[] selectionArgs = {email, password};
* Here query function is used to fetch records from user table this function works like we use sql
query.
* SQL query equivalent to this query function is
* SELECT user_id FROM user WHERE user_email = 'jack@androidtutorialshub.com' AND
user_password = 'qwerty';
*/
Cursor cursor = db.query(TABLE_USER, //Table to query
columns, //columns to return
selection, //columns for the WHERE clause
selectionArgs, //The values for the WHERE clause
null, //group the rows
null, //filter by row groups
null); //The sort order
cursor.close();
db.close();
if (cursorCount > 0) {
return true;
}
return false;
}
}
Creamos la actividad LoginActivity, para ello clic derecho sobre la carpeta principal del
proyecto y creamos una actividad en blanco.
Colocamos el nombre de la actividad y se creará su layout, esta acción creará la clase java.
<android.support.v4.widget.NestedScrollView
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/nestedScrollView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/colorBackground"
android:paddingBottom="20dp"
android:paddingLeft="20dp"
android:paddingRight="20dp"
android:paddingTop="20dp"
tools:context=".LoginActivity">
<android.support.v7.widget.LinearLayoutCompat
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<android.support.v7.widget.AppCompatImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginTop="40dp"
android:src="@drawable/logo" />
<android.support.design.widget.TextInputLayout
android:id="@+id/textInputLayoutEmail"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="40dp">
<android.support.design.widget.TextInputEditText
android:id="@+id/textInputEditTextEmail"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="@string/hint_email"
android:inputType="text"
android:maxLines="1"
android:textColor="@android:color/white" />
</android.support.design.widget.TextInputLayout>
<android.support.design.widget.TextInputLayout
android:id="@+id/textInputLayoutPassword"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="20dp">
<android.support.design.widget.TextInputEditText
android:id="@+id/textInputEditTextPassword"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="@string/hint_password"
android:inputType="textPassword"
android:maxLines="1"
android:textColor="@android:color/white" />
</android.support.design.widget.TextInputLayout>
<android.support.v7.widget.AppCompatButton
android:id="@+id/appCompatButtonLogin"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="40dp"
android:background="@color/colorTextHint"
android:text="@string/text_login" />
<android.support.v7.widget.AppCompatTextView
android:id="@+id/textViewLinkRegister"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_marginTop="30dp"
android:gravity="center"
android:text="@string/text_not_member"
android:textSize="16dp" />
</android.support.v7.widget.LinearLayoutCompat>
</android.support.v4.widget.NestedScrollView>
Esta clase nos permite validar los valores ingresados en las cajas de textos. Para ello lo
alojaremos en un paquete de ayuda llamado ―helpers‖
Ahora creamos la clase dentro de este paquete, clic derecho sobre la carpeta(paquete)
creada y nueva clase java, la cual se llamará InputValidation,
Adicionamos el siguiente
código que contiene
métodos de validación para
el campo de entrada.
Validación como entrada
vacía, correo electrónico
válido y etc.
import android.app.Activity;
import android.content.Context;
import android.support.design.widget.TextInputEditText;
import android.support.design.widget.TextInputLayout;
import android.view.View;
import android.view.WindowManager;
import android.view.inputmethod.InputMethodManager;
/**
* constructor
*
* @param context
*/
public InputValidation(Context context) {
this.context = context;
}
/**
* method to check InputEditText filled .
*
* @param textInputEditText
* @param textInputLayout
* @param message
* @return
*/
public boolean isInputEditTextFilled(TextInputEditText textInputEditText, TextInputLayout
textInputLayout, String message) {
String value = textInputEditText.getText().toString().trim();
if (value.isEmpty()) {
textInputLayout.setError(message);
hideKeyboardFrom(textInputEditText);
return false;
} else {
textInputLayout.setErrorEnabled(false);
}
return true;
}
/**
* method to check InputEditText has valid email .
*
* @param textInputEditText
* @param textInputLayout
* @param message
* @return
*/
public boolean isInputEditTextEmail(TextInputEditText textInputEditText, TextInputLayout
textInputLayout, String message) {
String value = textInputEditText.getText().toString().trim();
if (value.isEmpty() || !android.util.Patterns.EMAIL_ADDRESS.matcher(value).matches()) {
textInputLayout.setError(message);
hideKeyboardFrom(textInputEditText);
return false;
} else {
textInputLayout.setErrorEnabled(false);
}
return true;
}
/**
* method to Hide keyboard
*
* @param view
*/
private void hideKeyboardFrom(View view) {
InputMethodManager imm = (InputMethodManager)
context.getSystemService(Activity.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(view.getWindowToken(),
WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
}
}
Colocamos el nombre de la actividad y se creará su layout, esta acción creará la clase java.
<android.support.v4.widget.NestedScrollView
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/nestedScrollView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/colorBackground"
android:paddingBottom="20dp"
android:paddingLeft="20dp"
android:paddingRight="20dp"
android:paddingTop="20dp"
tools:context=".LoginActivity">
<android.support.v7.widget.LinearLayoutCompat
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<android.support.v7.widget.AppCompatImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginTop="40dp"
android:src="@drawable/logo_escudo_unmsm" />
<android.support.design.widget.TextInputLayout
android:id="@+id/textInputLayoutName"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="40dp">
<android.support.design.widget.TextInputEditText
android:id="@+id/textInputEditTextName"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="@string/hint_name"
android:inputType="text"
android:maxLines="1"
android:textColor="@android:color/white" />
</android.support.design.widget.TextInputLayout>
<android.support.design.widget.TextInputLayout
android:id="@+id/textInputLayoutEmail"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="20dp">
<android.support.design.widget.TextInputEditText
android:id="@+id/textInputEditTextEmail"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="@string/hint_email"
android:inputType="text"
android:maxLines="1"
android:textColor="@android:color/white" />
</android.support.design.widget.TextInputLayout>
<android.support.design.widget.TextInputLayout
android:id="@+id/textInputLayoutPassword"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="20dp">
<android.support.design.widget.TextInputEditText
android:id="@+id/textInputEditTextPassword"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="@string/hint_password"
android:inputType="textPassword"
android:maxLines="1"
android:textColor="@android:color/white" />
</android.support.design.widget.TextInputLayout>
<android.support.design.widget.TextInputLayout
android:id="@+id/textInputLayoutConfirmPassword"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="20dp">
<android.support.design.widget.TextInputEditText
android:id="@+id/textInputEditTextConfirmPassword"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="@string/hint_confirm_password"
android:inputType="textPassword"
android:maxLines="1"
android:textColor="@android:color/white" />
</android.support.design.widget.TextInputLayout>
<android.support.v7.widget.AppCompatButton
android:id="@+id/appCompatButtonRegister"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="40dp"
android:background="@color/colorTextHint"
android:text="@string/text_register" />
<android.support.v7.widget.AppCompatTextView
android:id="@+id/appCompatTextViewLoginLink"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_marginTop="30dp"
android:gravity="center"
android:text="@string/text_already_member"
android:textSize="16dp" />
</android.support.v7.widget.LinearLayoutCompat>
</android.support.v4.widget.NestedScrollView>
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.design.widget.Snackbar;
import android.support.design.widget.TextInputEditText;
import android.support.design.widget.TextInputLayout;
import android.support.v4.widget.NestedScrollView;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.AppCompatButton;
import android.support.v7.widget.AppCompatTextView;
import android.view.View;
import com.example.android.pets.R;
import com.example.android.pets.model.User;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_register);
getSupportActionBar().hide();
initViews();
initListeners();
initObjects();
}
/**
* This method is to initialize views
*/
private void initViews() {
nestedScrollView = (NestedScrollView) findViewById(R.id.nestedScrollView);
appCompatButtonRegister = (AppCompatButton)
findViewById(R.id.appCompatButtonRegister);
appCompatTextViewLoginLink = (AppCompatTextView)
findViewById(R.id.appCompatTextViewLoginLink);
/**
* This method is to initialize listeners
*/
/**
* This method is to initialize objects to be used
*/
private void initObjects() {
inputValidation = new InputValidation(activity);
databaseHelper = new DatabaseHelper(activity);
user = new User();
/**
* This implemented method is to listen the click on view
*
* @param v
*/
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.appCompatButtonRegister:
postDataToSQLite();
break;
case R.id.appCompatTextViewLoginLink:
finish();
break;
}
}
/**
* This method is to validate the input text fields and post data to SQLite
*/
private void postDataToSQLite() {
if (!inputValidation.isInputEditTextFilled(textInputEditTextName, textInputLayoutName,
getString(R.string.error_message_name))) {
return;
}
if (!inputValidation.isInputEditTextFilled(textInputEditTextEmail, textInputLayoutEmail,
getString(R.string.error_message_email))) {
return;
}
if (!inputValidation.isInputEditTextEmail(textInputEditTextEmail, textInputLayoutEmail,
getString(R.string.error_message_email))) {
return;
}
if (!inputValidation.isInputEditTextFilled(textInputEditTextPassword, textInputLayoutPassword,
getString(R.string.error_message_password))) {
return;
}
if (!inputValidation.isInputEditTextMatches(textInputEditTextPassword,
textInputEditTextConfirmPassword,
textInputLayoutConfirmPassword, getString(R.string.error_password_match))) {
return;
}
if (!databaseHelper.checkUser(textInputEditTextEmail.getText().toString().trim())) {
user.setName(textInputEditTextName.getText().toString().trim());
user.setEmail(textInputEditTextEmail.getText().toString().trim());
user.setPassword(textInputEditTextPassword.getText().toString().trim());
databaseHelper.addUser(user);
} else {
// Snack Bar to show error message that record already exists
Snackbar.make(nestedScrollView, getString(R.string.error_email_exists),
Snackbar.LENGTH_LONG).show();
}
/**
* This method is to empty all input edit text
*/
private void emptyInputEditText() {
textInputEditTextName.setText(null);
textInputEditTextEmail.setText(null);
textInputEditTextPassword.setText(null);
textInputEditTextConfirmPassword.setText(null);
}
}
Esta clase nos permite validar obtener valores de la BD y colocarlos en las cajas de textos.
Para ello lo alojaremos en un paquete de ayuda llamado ―adapters‖
item_user_recycler.xml
<android.support.v7.widget.CardView
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:card_view="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="wrap_content"
card_view:cardCornerRadius="4dp">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:padding="16dp">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<android.support.v7.widget.AppCompatTextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="2"
android:text="@string/hint_name"
android:textColor="@color/colorTextHint" />
<android.support.v7.widget.AppCompatTextView
android:id="@+id/textViewName"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="@string/hint_name"
android:textColor="@android:color/darker_gray" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="5dp"
android:orientation="horizontal">
<android.support.v7.widget.AppCompatTextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="2"
android:text="@string/hint_email"
android:textColor="@color/colorTextHint" />
<android.support.v7.widget.AppCompatTextView
android:id="@+id/textViewEmail"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="@string/hint_email"
android:textColor="@android:color/darker_gray" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="5dp"
android:orientation="horizontal">
<android.support.v7.widget.AppCompatTextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="2"
android:text="@string/hint_password"
android:textColor="@color/colorTextHint" />
<android.support.v7.widget.AppCompatTextView
android:id="@+id/textViewPassword"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="@string/hint_password"
android:textColor="@android:color/darker_gray" />
</LinearLayout>
</LinearLayout>
</android.support.v7.widget.CardView>
import android.support.v7.widget.AppCompatTextView;
import android.support.v7.widget.RecyclerView;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import java.util.List;
@Override
public UserViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
// inflating recycler item view
View itemView = LayoutInflater.from(parent.getContext())
.inflate(R.layout.item_user_recycler, parent, false);
@Override
public void onBindViewHolder(UserViewHolder holder, int position) {
holder.textViewName.setText(listUsers.get(position).getName());
holder.textViewEmail.setText(listUsers.get(position).getEmail());
holder.textViewPassword.setText(listUsers.get(position).getPassword());
}
@Override
public int getItemCount() {
Log.v(UsersRecyclerAdapter.class.getSimpleName(),""+listUsers.size());
return listUsers.size();
}
/**
* ViewHolder class
*/
public class UserViewHolder extends RecyclerView.ViewHolder {
Colocamos el nombre
de la actividad y se
creará su layout, esta
acción creará la clase
java.
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<android.support.v7.widget.LinearLayoutCompat
android:layout_width="match_parent"
android:layout_height="150dp"
android:background="@color/colorPrimary"
android:gravity="center"
android:orientation="vertical">
<android.support.v7.widget.AppCompatTextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/text_title"
android:textSize="20sp" />
<android.support.v7.widget.AppCompatTextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:text="@string/text_hello" />
<android.support.v7.widget.AppCompatTextView
android:id="@+id/textViewName"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</android.support.v7.widget.LinearLayoutCompat>
<android.support.v7.widget.AppCompatTextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingBottom="5dp"
android:paddingLeft="16dp"
android:paddingTop="5dp"
android:text="@string/text_accounts"
android:textColor="@android:color/black" />
<android.support.v7.widget.RecyclerView
android:id="@+id/recyclerViewUsers"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>
import android.os.AsyncTask;
import android.support.annotation.Nullable;
import android.support.v7.widget.AppCompatTextView;
import android.support.v7.widget.DefaultItemAnimator;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import java.util.ArrayList;
import java.util.List;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_users_list);
getSupportActionBar().setTitle("");
initViews();
initObjects();
/**
* This method is to initialize views
*/
private void initViews() {
textViewName = (AppCompatTextView) findViewById(R.id.textViewName);
recyclerViewUsers = (RecyclerView) findViewById(R.id.recyclerViewUsers);
}
/**
* This method is to initialize objects to be used
*/
private void initObjects() {
listUsers = new ArrayList<>();
usersRecyclerAdapter = new UsersRecyclerAdapter(listUsers);
recyclerViewUsers.setItemAnimator(new DefaultItemAnimator());
recyclerViewUsers.setHasFixedSize(true);
recyclerViewUsers.setAdapter(usersRecyclerAdapter);
databaseHelper = new DatabaseHelper(activity);
getDataFromSQLite();
}
/**
* This method is to fetch all user records from SQLite
*/
private void getDataFromSQLite() {
// AsyncTask is used that SQLite operation not blocks the UI Thread.
new AsyncTask<Void, Void, Void>() {
@Override
protected Void doInBackground(Void... params) {
listUsers.clear();
listUsers.addAll(databaseHelper.getAllUser());
return null;
}
@Override
protected void onPostExecute(Void aVoid) {
super.onPostExecute(aVoid);
usersRecyclerAdapter.notifyDataSetChanged();
}
}.execute();
}
}
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.design.widget.Snackbar;
import android.support.design.widget.TextInputEditText;
import android.support.design.widget.TextInputLayout;
import android.support.v4.widget.NestedScrollView;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.AppCompatButton;
import android.support.v7.widget.AppCompatTextView;
import android.view.View;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_register);
getSupportActionBar().hide();
initViews();
initListeners();
initObjects();
}
/**
appCompatButtonRegister = (AppCompatButton)
findViewById(R.id.appCompatButtonRegister);
appCompatTextViewLoginLink = (AppCompatTextView)
findViewById(R.id.appCompatTextViewLoginLink);
/**
* This method is to initialize listeners
*/
private void initListeners() {
appCompatButtonRegister.setOnClickListener(this);
appCompatTextViewLoginLink.setOnClickListener(this);
/**
* This method is to initialize objects to be used
*/
private void initObjects() {
inputValidation = new InputValidation(activity);
databaseHelper = new DatabaseHelper(activity);
user = new User();
/**
* This implemented method is to listen the click on view
*
* @param v
*/
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.appCompatButtonRegister:
postDataToSQLite();
break;
case R.id.appCompatTextViewLoginLink:
finish();
break;
}
}
/**
* This method is to validate the input text fields and post data to SQLite
*/
private void postDataToSQLite() {
if (!inputValidation.isInputEditTextFilled(textInputEditTextName, textInputLayoutName,
getString(R.string.error_message_name))) {
return;
}
if (!inputValidation.isInputEditTextFilled(textInputEditTextEmail, textInputLayoutEmail,
getString(R.string.error_message_email))) {
return;
}
if (!inputValidation.isInputEditTextEmail(textInputEditTextEmail, textInputLayoutEmail,
getString(R.string.error_message_email))) {
return;
}
if (!inputValidation.isInputEditTextFilled(textInputEditTextPassword, textInputLayoutPassword,
getString(R.string.error_message_password))) {
return;
}
if (!inputValidation.isInputEditTextMatches(textInputEditTextPassword,
textInputEditTextConfirmPassword,
textInputLayoutConfirmPassword, getString(R.string.error_password_match))) {
return;
}
if (!databaseHelper.checkUser(textInputEditTextEmail.getText().toString().trim())) {
user.setName(textInputEditTextName.getText().toString().trim());
user.setEmail(textInputEditTextEmail.getText().toString().trim());
user.setPassword(textInputEditTextPassword.getText().toString().trim());
databaseHelper.addUser(user);
} else {
// Snack Bar to show error message that record already exists
Snackbar.make(nestedScrollView, getString(R.string.error_email_exists),
Snackbar.LENGTH_LONG).show();
}
/**
* This method is to empty all input edit text
*/
k. Configuramos el proyecto
Abrimos el archivo manifests para adicionar la actividad que hemos creado, adicionar
estos códigos debajo de la actividad splash:
Cambiar las intenciones en la clase splash.java para que llame a la siguiente actividad
que es Loginactivity.class
El Proyecto app Mascotas tiene un menú en el cual podremos registrar una mascota y
adicionar un registro, podemos adicionar más ítems, en este caso dado que hemos
colocado un login tenemos una relación de usuarios, ya que hemos creado la actividad
para ello faltaría usarla, colocando un ítem más al menú existente, para esto realizamos lo
siguiente:
case R.id.action_lista_usuarios:
<item
android:id="@+id/action_lista_usuarios"
android:title="@string/action_lista_usuarios"
app:showAsAction="never" />
http://www.androidtutorialshub.com/android-login-and-register-with-sqlite-database-
tutorial/
Revisar :
</resources>
<android.support.constraint.ConstraintLayout …… tools:context=".MainActivity">
package com.example.cenpro_pc.hellotoast6;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View; //referencia a la vista
Ninjamock
Es un Diseñador de layout. wireframe and mockup tool
Intents
Cuando se emplea:
Cuando empleamos una actividad, servicio, broacast
Para su uso se debe importar el paquete:
import android.content.Intent;
TEMARIO
GIT
Intenciones de la guía
Componentes en Android:
- Actividades
- Servicios
- Content provider
- Consumidores (service provider)
1. Git (repositorio)
Creamos el token
Clic en share
https://github.com/settings/tokens
(compartir)
https://github.com/bfpalacios/APPMOVILCITAS
https://github.com/bfpalacios/DISDOC_MOVIL
https://github.com/bfpalacios/SEGSIL_MOVIL
Testiar el enlace
Base de datos
Firebase, Versiones:
https://github.com/new
1. Creamos el repositorio
2. Subimos el proyecto mediante el menú VSC ->import into versión control ->
share Project on github
4.4 Actualizar
proyecto en github
TIPOS COMPONENTES
Actividades
Servicios
Servicios de contenido
https://codelabs.developers.google.com/codelabs/android-training-create-an-
activity/index.html?index=..%2F..%2Fandroid-training#6
https://github.com/google-developer-training/android-fundamentals-apps-
v2/tree/master/TwoActivities
https://github.com/google-developer-training/android-fundamentals-apps-v2
<Button
android:onClick="launchSecondActivity"
startActivityForResult(intent, TEXT_REQUEST);
}
<EditText
android:id="@+id/editText_main"
Clase R
Próxima clase
Principios
Scrum Alliance
Scrum org
Scrum study
Análisis
Diseño
Construcción
Pruebas
Artefactos Scrum
1. VISION
2. Product Backlog: todas tareas que involucran el desarrollo, ejemplo 100 tareas se le
puede asignar pesos, estas se escriben en cartas de cartulina.
3. Sprint: tiempo de entrega del producto, de 4 a 6 semanas de duración del sprint
Del ejemplo si son 6 sprint, lo dividimos entre las tareas para agruparlas.
4. Product Backlog priorizado
De la relación de sprint de prioriza por tareas complejas
Ejemplo:
Sprint 1: 17 tareas (+ complejas)
Sprint 2: 16 tareas (- complejas)
Roles de Scrum:
Certificados:
TAREA:
Esta aplicación puede reenviar su datos a la nube en BD no sql, esto se realiza mediante
REST (.jar) la cual es el nexo entre los datos JSON de la bd sqlite
ARQUITECTURA:
SERVER BD
Servicio: NO SQL
SQLlite
JSON REST Firebase
APP Google
D .JAR AWS (amazon)
MOVIL A AZURE
T
A
SERVER web
APP
Tomcat
MOVIL SERVER BD
Jboss
weblogic ORACLE
SQL
D
A
T Servicio:
A REST
SOAP
W.S
.WAR
REVISAR:
LA VERSION DE SDK:
<activity
android:name=".CatalogActivity"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
CatalogActivity
Abrir CatalogActivity.java
Funcionalidad:
PRODUCT BACKLOG:
Maquetas de pantallas
Dos opciones:
User: correo
Pass: dnitani
https://balsamiq.com/wireframes/desktop/#
Proyecto final
ARQUITECTURA
Data
Presentación Firebase
REST
(Este paquete de conexión lo maneja GRADLE)
APK: es el empaquetado que contiene .class que son archivos compilados, los .apk no se
ejecuta sino se interpreta mediante las maquina virtuales.
BASE DE DATOS: Amazon, AWS, Microsoft Azure, Red Hat Open Shift.
Realtime: es menos rápido el acceso de información. El sistema de citas usa esta base
datos, pero para aumentar el tiempo de transacción emplea Kunernetes, el cual maneja
clusterización, en donde la petición lo convierte en ½ petición.
Entrar a build.gradle
android {
compileSdkVersion 27
defaultConfig {
applicationId "pe.edu.unmsm.sistemas.appclinica"
minSdkVersion 21
targetSdkVersion 27
versionCode 21
versionName "2.1"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
Tener una carpeta JSON, esta permite también conectarse a base de datos
normalizadas como Oracle, SQL Server
App web
Capara de presentación
CaPA Controlador
Capa de Negocio
Capa acceso de datos (hacia una BD o Rest, SOAP)
FIREBASE - realtime
FIREB
ASE -
REAL reservaci tp2.2018i.reservacitas.un https://console.firebase.google.com/u/1/project/reserv
TIME tas@$ msm@gmail.com a-de-cit/database/reserva-de-cit/data
GOO
GLE
APP
ENGI reservaci tp2.2018i.reservacitas.un https://console.cloud.google.com/home/dashboard?a
NE tas@$ msm@gmail.com uthuser=2&hl=es&project=reserva-de-cit
FIREBASE - Document
https://accounts.google.com/ServiceLogin/signinchooser?passive=1209600&osid=
1&continue=https%3A%2F%2Fconsole.firebase.google.com%2F&followup=https%3
A%2F%2Fconsole.firebase.google.com%2F&flowName=GlifWebSignIn&flowEntry=S
erviceLogin
Proyecto SEGSIL_MOVIL
Pass: 1 al 6
https://console.firebase.google.com/u/1/
android {
compileSdkVersion 28
defaultConfig {
applicationId
"pe.edu.unmsm.libroscentroprduccion.ventavirtuallibrossanmarcos"
minSdkVersion 15
targetSdkVersion 28
versionCode 1
versionName "1.0"
testInstrumentationRunner
"android.support.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'),
'proguard-rules.pro'
}
}
}
pe.edu.unmsm.libroscentroprduccion.ventavirtuallibrossanmarcos
C++
content_copy
Copiar
buildscript {
dependencies {
// Add this line
classpath 'com.google.gms:google-services:4.0.1'
}
}
Build.gradle de nivel de aplicación (<proyecto>/<app-module>/build.gradle):
content_copy
Copiar
content_copy
Copiado
dependencies {
// Add this line
implementation 'com.google.firebase:firebase-core:16.0.1'
}
...
// Add to the bottom of the file
apply plugin: 'com.google.gms.google-services'
Incluye Analytics de forma predeterminada help_outline
Por último, pulsa Sincronizar ahora en la barra que aparece en el IDE:
firebaseAuth = FirebaseAuth.getInstance();
db = FirebaseFirestore.getInstance();