Hola amigos les saludo, acabo de recibir algunos correos con ciertas dudas y referente a los navigationdrawer y como hacer que aparezca en la parte superior el nombre, la dirección y la foto del usuario logueado.

Como hacer que aparezca en la parte superior de un Navigation Drawer el nombre, la dirección y la foto del usuario logueado.
Que necesitamos?
- Android Studio version 3.x
- WebServices
- Base de Datos
- Muchas Ganas de Aprender
BASE DE DATOS
Empezaremos creando nuestra base de datos en mi caso le llamare drawer y tendrá lo siguiente:
CREATE TABLE `usuario` ( `id` int(11) NOT NULL, `email` varchar(300) NOT NULL, `foto` varchar(300) NOT NULL, `nombres` varchar(300) NOT NULL, `password` varchar(100) NOT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1; -- -- Volcado de datos para la tabla `usuario` -- INSERT INTO `usuario` (`id`, `email`, `foto`, `nombres`, `password`) VALUES (1, '[email protected]', 'perfil_fotos/androfast.png', 'ANDROFAST', '12345');
WEBSERVICES
Ahora Sr. y Sra. Vergas nos toca empezar con nuestro código PHP que nos permitirá hacer el puente entre la base de datos y nuestra app, como yo lo estoy creando de forma local en xampp dentro de htdocs creare una carpeta llamada NavigationDrawer y tendrá lo siguiente:

Si se fijan bien tendremos 3 archivos PHP y una carpeta donde estarán guardada las fotos de nuestros usuario que iniciaran sesión.
conexion.php
<?php
class Conectar{
public static function conexion(){
try{
$conexion = new PDO('mysql:host=localhost; dbname=drawer','root','12345');
$conexion -> setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$conexion -> exec("SET CHARACTER SET UTF8");
}catch(Exception $e){
die("Error " . $e->getMessage());
echo "Linea del error " . $e->getLine();
}
return $conexion;
}
}
?>
registrar.php
<?php
require_once("conexion.php");
class SignupUser {
private $db;
private $conexion;
function __construct() {
$this -> db = new Conectar();
$this -> conexion = $this->db->conexion();
}
public function does_user_exist($email,$password,$url_image,$nombres)
{
$query = "Select * from usuario where email='$email'";
$result = $this -> conexion->prepare($query);
$result->execute();
if($result->rowCount() == 1){
$json['error'] = 'Ya existe un usuario con '.$email;
echo json_encode($json);
}else{
//registro
$query = "insert into usuario (email, password, foto, nombres) values (?,?,?,?)";
$inserted = $this->conexion->prepare($query);
$inserted->bindParam(1, $email, PDO::PARAM_STR);
$inserted->bindParam(2, $password, PDO::PARAM_STR);
$inserted->bindParam(3, $url_image, PDO::PARAM_STR);
$inserted->bindParam(4, $nombres, PDO::PARAM_STR);
if($inserted->execute()){
$json['success'] = 'Cuenta creada';
$query = "SELECT id,email,foto,nombres FROM usuario WHERE email = ?";
try {
// Preparar sentencia
$comando = $this->conexion->prepare($query);
// Ejecutar sentencia preparada
$comando->execute(array($email));
// Capturar primera fila del resultado
$row = $comando->fetch(PDO::FETCH_ASSOC);
$json['usuario'][]=$row;
} catch (PDOException $e) {
// Aquí puedes clasificar el error dependiendo de la excepción
// para presentarlo en la respuesta Json
return -1;
}
}else{
$json['error'] = 'Se produjo un error';
}
echo json_encode($json);
}
}
}
$signupUser = new SignupUser();
if(isset($_POST['email'],$_POST['password'],$_POST['nombres'])) {
$email = $_POST['email'];
$password = $_POST['password'];
$nombres = $_POST['nombres'];
$image = $_POST['foto'];
if($image!="no imagen"){
$path = "perfil_fotos/$nombres.jpg";
$url_image = "perfil_fotos/".$nombres.".jpg";// para no presentar errores, agregarle el id al nombre de la imagen
file_put_contents($path,base64_decode($image));
//$bytesArchivo=file_get_contents($path);//para guardar la imagen en la tabla de la bbdd
}else{
$url_image = "sin imagen";
}
if(!empty($email) && !empty($password) && !empty($nombres)){
$encrypted_password = md5($password);
$signupUser-> does_user_exist($email,$password,$url_image,$nombres);
}else{
echo json_encode("debe escribir ambas entradas");
}
}
?>
sesion.php
<?php
require_once("conexion.php");
class LoginUser {
private $db;
private $conexion;
function __construct() {
$this -> db = new Conectar();
$this -> conexion = $this->db->conexion();
}
public function does_user_exist($email,$password)
{
$query = "Select * from usuario where email='$email' and password = '$password'";
$result = $this -> conexion->prepare($query);
$result->execute();
if($result->rowCount() == 1){
$json['success'] = ' Bienvenido '.$email;
// Al igual como en register_movil, con este json enviamos los datos al MainActivity
$query = "SELECT id,email,foto,nombres FROM usuario WHERE email = ?";
try {
// Preparar sentencia
$comando = $this->conexion->prepare($query);
// Ejecutar sentencia preparada
$comando->execute(array($email));
// Capturar primera fila del resultado
$row = $comando->fetch(PDO::FETCH_ASSOC);
$json['usuario'][]=$row;
} catch (PDOException $e) {
$json['error'] = 'exception';
// Aquí puedes clasificar el error dependiendo de la excepción
// para presentarlo en la respuesta Json
return -1;
}
echo json_encode($json);
}else{
$json['error'] = 'Las credenciales de inicio de sesión son incorrectas';
echo json_encode($json);
}
}
}
$loginUser = new LoginUser();
if(isset($_POST['email'],$_POST['password'])) {
$email = $_POST['email'];
$password = $_POST['password'];
if(!empty($email) && !empty($password)){
$encrypted_password = md5($password);
$loginUser-> does_user_exist($email,$password);
}else{
echo json_encode("debe escribir ambas entradas");
}
}
?>
APLICACIÓN
Sr. y Sra. vergas llegamos a la parte final del ejemplo y toca meter mano a la APP entonces voy tratar de explicar de la forma mas detallada posible así que lee y no te pierdas :V
Al crear tu aplicación es muy obvio que escogerás al Navigation Drawer

Ahora debemos ir a nuestro build.gradle y agregar lo siguiente:
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'com.android.support:appcompat-v7:26.1.0'
implementation 'com.android.support:design:26.1.0'
implementation 'com.android.support.constraint:constraint-layout:1.0.2'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'com.android.support.test:runner:1.0.1'
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.1'
compile 'com.android.volley:volley:1.0.0'
compile 'com.github.bumptech.glide:glide:3.7.0' // biblioteca de carga de imagenes mejor que picasso
compile 'de.hdodenhof:circleimageview:2.1.0' // biblioteca para el ImageView circular incluyendo bordes
}
Ahora en su AndroidManifest deben agregar el siguiente permiso
<uses-permission android:name="android.permission.INTERNET"/>
NOTA: En este paso solo queda observar el código y algunos archivos XML, nada me costaría subir el proyecto, pero yo quiero que aprendas. Y no estés perdido después así que una vez mas te explicare paso a paso no te pierdas Don Vergas y Doña Vergas.
Agregando Archivos necesarios:
Deben agregar una carpeta llamada anim dentro del paquete res así como muestro en la siguiente imagen:

Dentro de dicha carpeta vamos agregar los siguientes archivos XML
push_left_in.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate
android:duration="500"
android:fromXDelta="100%p"
android:toXDelta="0" />
</set>
push_left_out.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate
android:duration="500"
android:fromXDelta="0"
android:toXDelta="-100%p" />
</set>
Ahora nos vamos a la carpeta layout y dentro debemos agregar los siguientes archivos XML
activity_login.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".Login">
<LinearLayout
android:paddingTop="35dp"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:orientation="vertical">
<TextView
android:layout_marginTop="10dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Bienvenido"
android:textColor="@android:color/black"
android:textSize="35dp" />
<TextView
android:layout_marginTop="5dp"
android:layout_gravity="center"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Introduce tu correo y contraseña"
android:textColor="@android:color/black"
android:textSize="17.5dp"/>
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:gravity="center"
android:paddingLeft="24dp"
android:paddingRight="24dp">
<android.support.design.widget.TextInputLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="8dp"
android:layout_marginTop="8dp"
android:hint="E-mail"
android:textColorHint="@color/colorPrimary">
<android.support.design.widget.TextInputEditText
android:textColor="@android:color/black"
android:backgroundTint="@color/colorPrimaryDark"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/etusuario"
android:layout_marginTop="8dp"
android:layout_marginBottom="8dp"
android:inputType="textEmailAddress"/>
</android.support.design.widget.TextInputLayout>
<android.support.design.widget.TextInputLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="8dp"
android:layout_marginTop="8dp"
android:hint="Password"
android:textColorHint="@color/colorPrimary">
<android.support.design.widget.TextInputEditText
android:textColor="@android:color/black"
android:backgroundTint="@color/colorPrimaryDark"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="8dp"
android:layout_marginBottom="8dp"
android:id="@+id/etpass"
android:inputType="textPassword"/>
</android.support.design.widget.TextInputLayout>
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="ACCEDER"
android:id="@+id/btn_acceder"
android:layout_below="@+id/etpass"
android:onClick="ingresar"
android:backgroundTint="@color/colorPrimaryDark"
android:textColor="@android:color/white"
android:layout_marginTop="24dp"
android:layout_marginBottom="24dp"/>
<TextView android:id="@+id/signup"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="24dp"
android:text="Eres nuevo aqui? Registrate"
android:gravity="center"
android:textColor="@color/colorAccent_r"
android:textSize="16dip"/>
</LinearLayout>
</LinearLayout>
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/drawer_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true"
tools:openDrawer="start">
<include
layout="@layout/app_bar_main"
android:layout_width="match_parent"
android:layout_height="match_parent" />
<android.support.design.widget.NavigationView
android:id="@+id/nav_view"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_gravity="start"
android:fitsSystemWindows="true"
app:headerLayout="@layout/nav_header_main"
app:menu="@menu/activity_main_drawer" />
</android.support.v4.widget.DrawerLayout>
activity_registrar.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".Registrar">
<de.hdodenhof.circleimageview.CircleImageView
android:layout_gravity="center"
android:layout_marginTop="15dp"
android:layout_width="160dp"
android:layout_height="160dp"
android:id="@+id/usuario_imagen_registro"
android:src="@drawable/profile"
android:scaleType="centerCrop"
app:civ_border_color="@color/colorPrimaryDark"
app:civ_border_width="4dp"/>
<LinearLayout
android:layout_marginTop="20dp"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:gravity="center"
android:paddingLeft="24dp"
android:paddingRight="24dp">
<android.support.design.widget.TextInputLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="13dp"
android:hint="Nombre"
android:textColorHint="@color/colorPrimary">
<android.support.design.widget.TextInputEditText
android:textColor="@android:color/black"
android:backgroundTint="@color/colorPrimaryDark"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="2dp"
android:layout_marginBottom="2dp"
android:id="@+id/nombre_registro"
android:inputType="textCapWords|textPersonName"/>
</android.support.design.widget.TextInputLayout>
<android.support.design.widget.TextInputLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="E-mail"
android:textColorHint="@color/colorPrimary">
<android.support.design.widget.TextInputEditText
android:textColor="@android:color/black"
android:backgroundTint="@color/colorPrimaryDark"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="2dp"
android:layout_marginBottom="2dp"
android:id="@+id/correo_registro"
android:inputType="textEmailAddress"/>
</android.support.design.widget.TextInputLayout>
<android.support.design.widget.TextInputLayout
android:hint="Password"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textColorHint="@color/colorPrimary">
<android.support.design.widget.TextInputEditText
android:textColor="@android:color/black"
android:backgroundTint="@color/colorPrimaryDark"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="2dp"
android:layout_marginBottom="2dp"
android:inputType="textPassword"
android:id="@+id/password_registro"/>
</android.support.design.widget.TextInputLayout>
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="REGRISTRAR"
android:id="@+id/btn_registro_usuario"
android:layout_marginTop="24dp"
android:layout_marginBottom="12dp"
android:backgroundTint="@color/colorPrimaryDark"
android:textColor="@android:color/white"
android:padding="12dp"/>
<TextView android:id="@+id/link_login"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Ya eres mienbro? Ingresa"
android:gravity="center"
android:textColor="@color/colorAccent_r"
android:textSize="16dip"/>
</LinearLayout>
</LinearLayout>
nav_header_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="@dimen/nav_header_height"
android:background="@drawable/side_nav_bar"
android:orientation="vertical"
android:paddingTop="@dimen/activity_vertical_margin"
android:paddingBottom="@dimen/activity_vertical_margin"
android:theme="@style/ThemeOverlay.AppCompat.Dark">
<LinearLayout
android:paddingLeft="7dp"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="left|center_vertical">
<de.hdodenhof.circleimageview.CircleImageView
android:id="@+id/fotoUsuario"
android:layout_width="80dp"
android:layout_height="80dp"
android:paddingTop="@dimen/nav_header_vertical_spacing"
android:scaleType="centerCrop"
android:src="@drawable/profile"
app:civ_border_color="@android:color/white"
app:civ_border_width="2dp"
app:srcCompat="@android:drawable/sym_def_app_icon" />
</LinearLayout>
<LinearLayout
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="bottom"
android:orientation="vertical">
<TextView
android:id="@+id/txtNombreUsuario"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingTop="10dp"
android:text="Sin nombre"
android:textAppearance="@style/TextAppearance.AppCompat.Body1" />
<TextView
android:id="@+id/txtEmailUsuario"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="[email protected]" />
</LinearLayout>
</LinearLayout>
Con esto hemos terminado los archivos XML dentro de layout, hay mas archivos que se crean por defecto pero no los e puesto porque no se modifican nada para este ejercicio, a continuación les dejo una imagen de como quedaría estos archivos:

Ahora vas ir a la carpeta values y debes modificar algunos archivos xml
colors.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<color name="colorPrimary">#3F51B5</color>
<color name="colorPrimaryDark">#303F9F</color>
<color name="colorAccent">#303F9F</color>
<color name="colorAccent_r">#FF4081</color>
<color name="viewBg">#f1f5f8</color>
</resources>
styles.xml
<resources>
<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
<!-- Customize your theme here. -->
<item name="colorPrimary">@color/colorPrimary</item>
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
<item name="colorAccent">@color/colorAccent</item>
</style>
<style name="AppTheme.NoActionBar">
<item name="windowActionBar">false</item>
<item name="windowNoTitle">true</item>
</style>
<style name="AppTheme.AppBarOverlay" parent="ThemeOverlay.AppCompat.Dark.ActionBar" />
<style name="AppTheme.PopupOverlay" parent="ThemeOverlay.AppCompat.Light" />
<style name="AppTheme.Dark" parent="Theme.AppCompat.NoActionBar">
<item name="colorPrimary">@color/colorPrimary</item>
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
<item name="colorAccent">@color/colorAccent</item>
<item name="android:windowBackground">@color/viewBg</item>
</style>
</resources>
Ahora debes ir dentro de la carpeta drawable y pegar la imagen siguiente que nos servirá cuando no cargue nuestra foto de cliente.

Ahora toca meter mano a nuestro código JAVA
y tendremos los siguientes archivos
Conexion
recuerden cambiarlo por la dirección exacta de su webservices
public class Conexion {
public static final String URL_WEB_SERVICE = "http://192.168.8.133/NavigationDrawer/";
}
Usuario
import android.os.Parcel;
import android.os.Parcelable;
/**
* Created by ANDROFAST on 29/01/2018.
*/
public class Usuario implements Parcelable {
private int id;
private String email;
private String pass;
private String nombre;
private String foto;
public String getFoto() {
return foto;
}
public void setFoto(String foto) {
this.foto = foto;
}
public Usuario() {
}
public Usuario(int id, String email, String username, String nombre) {
this.id = id;
this.email = email;
this.nombre = nombre;
}
public Usuario(int id, String correo, String username, String pass, String nombre) {
this.id = id;
this.email = correo;
this.pass = pass;
this.nombre = nombre;
}
public void setId(int id) {
this.id = id;
}
public void setEmail(String email) {
this.email = email;
}
public void setPass(String pass) {
this.pass = pass;
}
public int getId() {
return id;
}
public String getEmail() {
return email;
}
public String getPass() {
return pass;
}
public String getNombre() {
return nombre;
}
public void setNombre(String nombre) {
this.nombre = nombre;
}
protected Usuario(Parcel in) {
id = in.readInt();
email = in.readString();
pass = in.readString();
nombre = in.readString();
foto = in.readString();
}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeInt(id);
dest.writeString(email);
dest.writeString(pass);
dest.writeString(nombre);
dest.writeString(foto);
}
@SuppressWarnings("unused")
public static final Parcelable.Creator<Usuario> CREATOR = new Parcelable.Creator<Usuario>() {
@Override
public Usuario createFromParcel(Parcel in) {
return new Usuario(in);
}
@Override
public Usuario[] newArray(int size) {
return new Usuario[size];
}
};
}
Login
import android.app.ProgressDialog;
import android.content.Intent;
import android.os.Bundle;
import android.support.design.widget.TextInputEditText;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;
import com.androfast.pc.appnavigationdraweloginmsql.datos.Conexion;
import com.android.volley.AuthFailureError;
import com.android.volley.Request;
import com.android.volley.RequestQueue;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.StringRequest;
import com.android.volley.toolbox.Volley;
import com.androfast.pc.appnavigationdraweloginmsql.negocio.Usuario;
import org.json.JSONException;
import org.json.JSONObject;
import java.util.HashMap;
import java.util.Map;
/**
* Created by ANDROFAST on 29/01/2018.
*/
public class Login extends AppCompatActivity {
private Button acceder;
private TextView registrar;
private TextInputEditText email;
private TextInputEditText password;
private ProgressDialog progreso;
private RequestQueue requestQueue;
StringRequest stringRequest;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
email = (TextInputEditText)findViewById(R.id.etusuario);
password = (TextInputEditText)findViewById(R.id.etpass);
acceder = (Button)findViewById(R.id.btn_acceder);
registrar = (TextView)findViewById(R.id.signup);
requestQueue = Volley.newRequestQueue(this);
registrar.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent =new Intent(getApplicationContext(),Registrar.class);
startActivity(intent);
overridePendingTransition(R.anim.push_left_in, R.anim.push_left_out);
finish();
}
});
acceder.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
iniciar();
}
});
}
private void iniciar() {
if (!validar()) return;
progreso = new ProgressDialog(this);
progreso.setMessage("Iniciando...");
progreso.show();
String url = Conexion.URL_WEB_SERVICE +"sesion.php?";
stringRequest = new StringRequest(Request.Method.POST, url, new Response.Listener<String>() {
@Override
public void onResponse(String response) {
Usuario userParcelable = new Usuario();;
Log.i("RESPUESTA JSON: ",""+response);
try {
JSONObject jsonObject = new JSONObject(response);
if(jsonObject.names().get(0).equals("success")){
email.setText("");
password.setText("");
userParcelable.setId(jsonObject.getJSONArray("usuario").getJSONObject(0).getInt("id"));
userParcelable.setEmail(jsonObject.getJSONArray("usuario").getJSONObject(0).getString("email"));
userParcelable.setNombre(jsonObject.getJSONArray("usuario").getJSONObject(0).getString("nombres"));
userParcelable.setFoto(jsonObject.getJSONArray("usuario").getJSONObject(0).getString("foto"));
Toast.makeText(getApplicationContext(),jsonObject.getString("success"), Toast.LENGTH_SHORT).show();
progreso.dismiss();
Intent intent = new Intent(getApplicationContext(),MainActivity.class);
intent.putExtra("DATA_USER",userParcelable);
startActivity(intent);
finish();
}else{
Toast.makeText(getApplicationContext(),jsonObject.getString("error"), Toast.LENGTH_SHORT).show();
Log.i("RESPUESTA JSON: ",""+jsonObject.getString("error"));
}
} catch (JSONException e) {
e.printStackTrace();
}
progreso.dismiss();
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Toast.makeText(getApplicationContext(),"No se ha podido conectar", Toast.LENGTH_SHORT).show();
progreso.dismiss();
}
}) {
@Override
protected Map<String, String> getParams() throws AuthFailureError {//para enviar los datos mediante POST
String sEmail = email.getText().toString();
String sPassword = password.getText().toString();
Map<String,String> parametros = new HashMap<>();
parametros.put("email",sEmail);
parametros.put("password",sPassword);
//estos parametros son enviados a nuestro web service
return parametros;
}
};
requestQueue.add(stringRequest);
}
private boolean validar() {
boolean valid = true;
String sEmail = email.getText().toString();
String sPassword = password.getText().toString();
if (sEmail.isEmpty() || !android.util.Patterns.EMAIL_ADDRESS.matcher(sEmail).matches()) {
email.setError("Introduzca una dirección de correo electrónico válida");
valid = false;
} else {
email.setError(null);
}
if (sPassword.isEmpty() || password.length() < 4 || password.length() > 10) {
password.setError("Entre 4 y 10 caracteres alfanuméricos");
valid = false;
} else {
password.setError(null);
}
return valid;
}
}
MainActivity
import android.os.Bundle;
import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.Snackbar;
import android.util.Log;
import android.view.View;
import android.support.design.widget.NavigationView;
import android.support.v4.view.GravityCompat;
import android.support.v4.widget.DrawerLayout;
import android.support.v7.app.ActionBarDrawerToggle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.ImageView;
import android.widget.TextView;
import com.androfast.pc.appnavigationdraweloginmsql.datos.Conexion;
import com.bumptech.glide.Glide;
import com.androfast.pc.appnavigationdraweloginmsql.negocio.Usuario;
public class MainActivity extends AppCompatActivity
implements NavigationView.OnNavigationItemSelectedListener {
private int ident;
private Usuario user;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
View header = ((NavigationView)findViewById(R.id.nav_view)).getHeaderView(0);
ImageView foto = (ImageView)header.findViewById(R.id.fotoUsuario);
try{
Bundle bundle = getIntent().getExtras();
user = bundle.getParcelable("DATA_USER");
if(bundle!=null){
ident = user.getId();
((TextView) header.findViewById(R.id.txtNombreUsuario)).setText(user.getNombre());
((TextView) header.findViewById(R.id.txtEmailUsuario)).setText(user.getEmail());
if(!user.getFoto().equals("sin imagen")){
String url_image = Conexion.URL_WEB_SERVICE +user.getFoto();
url_image = url_image.replace(" ","%20");
try {
Log.i("RESPUESTA IMAGEN: ",""+url_image);
Glide.with(this).load(url_image).into(foto);
} catch (Exception e) {
e.printStackTrace();
}
}
}
}catch (Exception e){
e.printStackTrace();
}
FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
fab.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Snackbar.make(view, "Reemplace con su propia acción", Snackbar.LENGTH_LONG)
.setAction("Action", null).show();
}
});
DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close);
drawer.setDrawerListener(toggle);
toggle.syncState();
NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view);
navigationView.setNavigationItemSelectedListener(this);
}
@Override
public void onBackPressed() {
DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
if (drawer.isDrawerOpen(GravityCompat.START)) {
drawer.closeDrawer(GravityCompat.START);
} else {
super.onBackPressed();
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
//noinspection SimplifiableIfStatement
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
@SuppressWarnings("StatementWithEmptyBody")
@Override
public boolean onNavigationItemSelected(MenuItem item) {
// Handle navigation view item clicks here.
int id = item.getItemId();
if (id == R.id.nav_camera) {
// Handle the camera action
} else if (id == R.id.nav_gallery) {
} else if (id == R.id.nav_slideshow) {
} else if (id == R.id.nav_manage) {
} else if (id == R.id.nav_share) {
} else if (id == R.id.nav_send) {
}
DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
drawer.closeDrawer(GravityCompat.START);
return true;
}
}
Registrar
import android.app.ProgressDialog;
import android.content.Intent;
import android.graphics.Bitmap;
import android.os.Build;
import android.os.Bundle;
import android.provider.MediaStore;
import android.support.design.widget.TextInputEditText;
import android.support.v7.app.AppCompatActivity;
import android.util.Base64;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
import com.androfast.pc.appnavigationdraweloginmsql.datos.Conexion;
import com.android.volley.AuthFailureError;
import com.android.volley.Request;
import com.android.volley.RequestQueue;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.StringRequest;
import com.android.volley.toolbox.Volley;
import com.androfast.pc.appnavigationdraweloginmsql.negocio.Usuario;
import org.json.JSONException;
import org.json.JSONObject;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
/**
* Created by ANDROFAST on 29/01/2018.
*/
public class Registrar extends AppCompatActivity {
private TextView loginLink;
private ImageView foto;
private TextInputEditText password;
private TextInputEditText nombre;
private TextInputEditText email;
private Button btnRegistrar;
private int request_code = 1;
private Bitmap bitmap;
private ProgressDialog progreso;
RequestQueue requestQueue; //permitara la conexion directamente del web service
StringRequest stringRequest;
@Override
protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_registrar);
foto = (ImageView) findViewById(R.id.usuario_imagen_registro);
loginLink = (TextView)findViewById(R.id.link_login);
email = (TextInputEditText)findViewById(R.id.correo_registro);
password = (TextInputEditText)findViewById(R.id.password_registro);
nombre = (TextInputEditText)findViewById(R.id.nombre_registro);
btnRegistrar = (Button)findViewById(R.id.btn_registro_usuario);
requestQueue = Volley.newRequestQueue(this);
btnRegistrar.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Registrar();
}
});
foto.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent i = null;
//verificacion de la version de plataforma
if(Build.VERSION.SDK_INT < 19){
//android 4.3 y anteriores
i = new Intent();
i.setAction(Intent.ACTION_GET_CONTENT);
}else {
//android 4.4 y superior
i = new Intent(Intent.ACTION_OPEN_DOCUMENT);
i.addCategory(Intent.CATEGORY_OPENABLE);
}
i.setType("image/*");
startActivityForResult(i, request_code);
}
});
loginLink.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(getApplicationContext(),Login.class);
startActivity(intent);
overridePendingTransition(R.anim.push_left_in, R.anim.push_left_out);
finish();
}
});
}
private void Registrar() {
if (!validar()) return;
progreso = new ProgressDialog(this);
progreso.setMessage("Iniciando...");
progreso.show();
String url = Conexion.URL_WEB_SERVICE +"btnRegistrar.php?";
//resultado = new Http().enviarPost(Http.URL_WEB_SERVICE+"listar-articulo.php",valoresPOST);
stringRequest = new StringRequest(Request.Method.POST, url, new Response.Listener<String>() {
@Override
public void onResponse(String response) {
Usuario usuario = new Usuario();;
Log.i("RESPUESTA JSON: ",""+response);
try {
JSONObject jsonObject = new JSONObject(response);
if(jsonObject.names().get(0).equals("success")){
email.setText("");
nombre.setText("");
password.setText("");
usuario.setId(jsonObject.getJSONArray("usuario").getJSONObject(0).getInt("id"));
usuario.setEmail(jsonObject.getJSONArray("usuario").getJSONObject(0).getString("email"));
usuario.setNombre(jsonObject.getJSONArray("usuario").getJSONObject(0).getString("nombres"));
usuario.setFoto(jsonObject.getJSONArray("usuario").getJSONObject(0).getString("foto"));
Toast.makeText(getApplicationContext(),jsonObject.getString("success"), Toast.LENGTH_SHORT).show();
progreso.dismiss();
Intent intent = new Intent(getApplicationContext(),MainActivity.class);
intent.putExtra("DATA_USER",usuario);
startActivity(intent);
finish();
}else{
Toast.makeText(getApplicationContext(),jsonObject.getString("error"), Toast.LENGTH_SHORT).show();
Log.i("RESPUESTA JSON: ",""+jsonObject.getString("error"));
}
} catch (JSONException e) {
e.printStackTrace();
}
progreso.dismiss();
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Toast.makeText(getApplicationContext(),"No se ha podido conectar", Toast.LENGTH_SHORT).show();
Log.i("ERROR: ",""+error.toString());
progreso.dismiss();
}
}){
@Override
protected Map<String, String> getParams() throws AuthFailureError {//para enviar los datos mediante POST
String sEmail = email.getText().toString();
String sPassword = password.getText().toString();
String sNombre = nombre.getText().toString();
String sImagePhoto = convertirImgString(bitmap);
Map<String,String> parametros = new HashMap<>();
parametros.put("email",sEmail);
parametros.put("password",sPassword);
parametros.put("foto",sImagePhoto);
parametros.put("nombres",sNombre);
//estos parametros son enviados a nuestro web service
return parametros;
}
};
requestQueue.add(stringRequest);
}
private String convertirImgString(Bitmap bitmap) {
String imagenString;
ByteArrayOutputStream array=new ByteArrayOutputStream();
if(bitmap!=null){
bitmap.compress(Bitmap.CompressFormat.JPEG,100,array);
byte[] imagenByte=array.toByteArray();
imagenString= Base64.encodeToString(imagenByte, Base64.DEFAULT);
}else{
imagenString = "no imagen"; //se enviara este string en caso de no haber imagen
}
return imagenString;
}
private boolean validar() {
boolean valid = true;
String sNombre = nombre.getText().toString();
String sPassword = password.getText().toString();
String sEmail = email.getText().toString();
if (sNombre.isEmpty() || sNombre.length() < 3) {
nombre.setError("Ingrese al menos 3 caracteres");
valid = false;
} else {
nombre.setError(null);
}
if (sEmail.isEmpty() || !android.util.Patterns.EMAIL_ADDRESS.matcher(sEmail).matches()) {
email.setError("Dirección de correo electrónico no válida");
valid = false;
} else {
email.setError(null);
}
if (sPassword.isEmpty() || password.length() < 4 || password.length() > 10) {
password.setError("Ingrese entre 4 a 10 caracteres alfanuméricos");
valid = false;
} else {
password.setError(null);
}
return valid;
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data){
if(resultCode == RESULT_OK && requestCode == request_code){
foto.setImageURI(data.getData());
try{
bitmap = MediaStore.Images.Media.getBitmap(this.getContentResolver(),data.getData());
foto.setImageBitmap(bitmap);
}catch (IOException e){
e.printStackTrace();
}
}
super.onActivityResult(requestCode, resultCode, data);
}
}
Por ultimo deben recordar que para que funcione bien deben llamar a sus clases dentro del AndroidManifest
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.androfast.pc.appnavigationdraweloginmsql">
<uses-permission android:name="android.permission.INTERNET"/> <!--no olvidar-->
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity
android:name=".MainActivity"
android:label="@string/app_name"
android:theme="@style/AppTheme.NoActionBar">
</activity>
<activity android:name=".Registrar"
android:theme="@style/AppTheme.Dark">
</activity>
<activity android:name=".Login"
android:theme="@style/AppTheme.Dark">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
Hola soy Alex Céspedes fundador de ANDROFAST, programo algunas cosas por diversión, me gusta aprender cosas nuevas y estoy pendiente de todo lo que tenga que ver con tecnología. Este blog lo cree para todas las personas que tengan dificultades en la programación, para ser sincero nunca fui bueno y reprobé algunos cursos de programación, pero mis ganas de aprender pudieron más. SI YO PUEDO TU PUEDES ANIMO!