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!