Está en la página 1de 75

ESTRUCTURA DE UN PROYECTO ANDROID 

/app/src/main/java
/app/src/main/res/

Contiene todos los ficheros de recursos necesarios para el proyecto: imágenes, vídeos,
cadenas de texto, etc.
Carpeta Descripción

Contiene las imágenes y otros elementos gráficos usados por la aplicación. Para poder definir diferentes recursos dependiendo de la
resolución y densidad de la pantalla del dispositivo se suele dividir en varias subcarpetas:
•/drawable (recursos independientes de la densidad)
/res/drawable/ •/drawable-ldpi (densidad baja)
•/drawable-mdpi (densidad media)
•/drawable-hdpi (densidad alta)
•/drawable-xhdpi (densidad muy alta)
•/drawable-xxhdpi (densidad muy muy alta :)

Contiene los iconos de lanzamiento de la aplicación (el icono que aparecerá en el menú de aplicaciones del dispositivo) para las
distintas densidades de pantalla existentes. Al igual que en el caso de las carpetas /drawable, se dividirá en varias subcarpetas
dependiendo de la densidad de pantalla:
/res/mipmap/ •/mipmap-mdpi
•/mipmap-hdpi
•/mipmap-xhdpi
•…

Contiene los ficheros de definición XML de las diferentes pantallas de la interfaz gráfica. Para definir distintos layouts dependiendo
de la orientación del dispositivo se puede dividir también en subcarpetas:
/res/layout/
•/layout (vertical)
•/layout-land  (horizontal)

/res/anim/
Contienen la definición de las animaciones utilizadas por la aplicación.
/res/animator/
/res/color/ Contiene ficheros XML de definición de listas de colores según estado.
/res/menu/ Contiene la definición XML de los menús de la aplicación.
/res/xml/ Contiene otros ficheros XML de datos utilizados por la aplicación.

/res/raw/ Contiene recursos adicionales, normalmente en formato distinto a XML, que no se incluyan en el resto de carpetas de recursos.

Contiene otros ficheros XML de recursos de la aplicación, como por ejemplo cadenas de texto (strings.xml), estilos (styles.xml),
/res/values/ colores (colors.xml), arrays de valores (arrays.xml), tamaños (dimens.xml), etc.
 /app/src/main/AndroidManifest.xml
Contiene la definición en XML de muchos de los aspectos principales de la aplicación, como por
ejemplo su identificación (nombre, icono, …), sus componentes (pantallas, servicios, …),  o los
permisos necesarios para su ejecución. Veremos más adelante más detalles de este fichero.

<?xml version="1.0" encoding="utf-8"?>


<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.cristian.controlesi">

<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity
android:name=".MainActivity"
android:label="@string/app_name"
android:theme="@style/AppTheme.NoActionBar">
<intent-filter>
<action android:name="android.intent.action.MAIN" />

<category android:name="android.intent.category.LAUNCHER" />


</intent-filter>
</activity>
</application>

</manifest>
/app/build.gradle
Contiene información necesaria para la compilación del proyecto, por ejemplo la versión
del SDK de Android utilizada para compilar, la mínima versión de Android que soportará
la aplicación, referencias a las librerías externas utilizadas, etc.
// Top-level build file where you can add configuration options common to all sub-projects/modules.

buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:2.1.0'

// NOTE: Do not place your application dependencies here; they belong


// in the individual module build.gradle files
}
}

allprojects {
repositories {
jcenter()
}
}

task clean(type: Delete) {


delete rootProject.buildDir
}
Activity
Una actividad es la representación visual e interactiva en tu aplicación. Por simpleza
podríamos sugerir que es una pantalla de la aplicación.

onStart(), onRestart(), onResume(), onPause(), onSto
p() y onDestroy().
Activity -  Manifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.cristian.controlesi">

<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity
android:name=".MainActivity"
android:label="@string/app_name"
android:theme="@style/AppTheme.NoActionBar">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name=".MainActivity2"
android:label="@string/title_activity_main2"
android:theme="@style/AppTheme.NoActionBar"></activity>
</application>

</manifest>
INTENTS
Un Intent es un mensaje que se envía de un componente a otro, o entre una aplicación a otra
para comunicarse. Podrían asemejarse a los links entre páginas web. Los Intents también
pueden guardar información primitiva de utilidad entre la comunicación
SERVICIOS
Un servicio es una entidad que ejecuta instrucciones en segundo plano sin que el usuario lo
note en la interfaz. Son muy utilizados para realizar acciones de larga duración mientras las
actividades muestran otro tipo de información. Por ejemplo guardar la información en la
base de datos, escuchar música mientras se ejecuta la aplicación, administrar conexiones de
red, etc

CONTENT PROVIDERS
Un Content Provider es una
interfaz que permite
intercambiar información
persistente y estructurada
entre dos aplicaciones.
Cada aplicación tiene
protegida su información,
de modo que están aisladas
de los contextos de otras
aplicaciones.
Primer Ejemplo

private EditText txtNombre;

@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
TextView txtSaludo;
setContentView(R.layout.activity_main1); @Override
} protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_saludo);
public void btEnviar(View view){
//Localizar los controles
//Creamos el Intent
Intent intent = new Intent(MainActivity1.this, SaludoActivity.class);
txtSaludo = (TextView)findViewById(R.id.txtSaludo);
txtNombre = (EditText)findViewById(R.id.txtNombre);
//Recuperamos la información pasada en el intent
//Creamos la información a pasar entre actividades - Pares Key-Value Bundle bundle = this.getIntent().getExtras();
Bundle b = new Bundle();
b.putString("NOMBRE", txtNombre.getText().toString());
//Construimos el mensaje a mostrar
//Añadimos la información al intent txtSaludo.setText("Hola " + bundle.getString("NOMBRE"));
intent.putExtras(b); }
//Iniciamos la nueva actividad
startActivity(intent);

}
Primer Ejemplo – Web Service

• Asynchtask: Es una interfaz creada, con


el fin de poder retornar los datos
obtenidos del servicio web.
• HttpRequest: Es una clase con el fin de
poder hacer llamados a páginas web
• WebService: Es la clase que se encarga
de realizar el llamado al servicio web, y
una vez obtenga los datos, los retorna a
la clase que implementa Asynchtask.
Primer Ejemplo – Web Service

1. Map<String, String> datos = new HashMap<String, String>();

2. WebService ws= new WebService("http://api.androidhive.info/contacts/", datos,

SaludoActivity.this, SaludoActivity.this);

3. ws.execute("");

Parámetros clase WebServiceurl

• WebService: Cadena  de texto que indica donde esta alojado el servicio web (algo
como http://www.ejemplosprogramacion.co/index.php/feed/)
• data: Una variable Map con los datos que necesita el servicio web, este campo
puede no ser necesario, en dicho caso, se envia un objeto Map vacio.
• activity: Actividad desde la que se llama a esta clase, esto con el fin de mostrar un
cuadro de “Loading”.
• callback: Clase que implementa la interfaz Asynchtask, y a la cual se le retornaran los
datos obtenidos dle servicio web.
Primer Ejemplo – Web Service
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.cristian.primeraapp">

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

<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity1">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".SaludoActivity" />
</application>

</manifest>
Primer Ejemplo – Web Service
1

public class SaludoActivity extends AppCompatActivity implements Asynchtask

Map<String, String> datos = new HashMap<String, String>();


WebService ws= new WebService("http://186.46.90.102/login.php?user=UTEQ&pass=123", datos,
SaludoActivity.this, SaludoActivity.this);
ws.execute("");

@Override
public void processFinish(String result) {
Log.i("processFinish", result);
txtresp.setText("Ws " + result.substring(0,100));
}
Primer Ejemplo – Web Service

<?php
echo ($_GET['usr']=='cristian' && $_GET['pass']=='123'?"User Auth":"Error Login");
?>
Primer Ejemplo – Web Service
http://api.androidhive.info/contacts/
ArrayList<HashMap<String, String>> contactList;
Segundo Ejemplo
Interfaz de Usuario: Controles de Selección

 (data source)
visual representation
Interfaz de Usuario: Controles de Selección
Row View Recycling
Interfaz de Usuario: Controles de Selección
Row View Recycling
Interfaz de Usuario: Controles de Selección

Adaptadores en Android (adapters)

final String[] datos =


new String[]{"Elem1","Elem2","Elem3","Elem4","Elem5"};

ArrayAdapter<String> adaptador =
new ArrayAdapter<String>(this,
android.R.layout.simple_spinner_item, datos);
Interfaz de Usuario: Controles de Selección
Spinners

1. cmbOpciones =
(Spinner)findViewById(R.id.CmbOpciones);

2. adaptador.setDropDownViewResource(
android.R.layout.simple_spinner_dr
opdown_item);

3. cmbOpciones.setAdapter(adaptador);
Interfaz de Usuario: Controles de Selección
Spinners
cmbOpciones.setOnItemSelectedListener(

new AdapterView.OnItemSelectedListener() {
public void onItemSelected(AdapterView<?> parent,
android.view.View v, int position, long id) {

TextView txtItem =
(TextView)findViewById(R.id.txtItem);

txtItem.setText("Seleccionado: " +
parent.getItemAtPosition(position));
}

public void onNothingSelected(AdapterView<?> parent) {


TextView txtItem =
(TextView)findViewById(R.id.txtItem);
txtItem.setText("");
}
});
Interfaz de Usuario: Controles de Selección
Spinners
cmbOpciones.setOnItemSelectedListener(

new AdapterView.OnItemSelectedListener() {
public void onItemSelected(AdapterView<?> parent,
android.view.View v, int position, long id) {

TextView txtItem =
(TextView)findViewById(R.id.txtItem);

txtItem.setText("Seleccionado: " +
parent.getItemAtPosition(position));
}

public void onNothingSelected(AdapterView<?> parent) {


TextView txtItem =
(TextView)findViewById(R.id.txtItem);
txtItem.setText("");
}
});
Interfaz de Usuario: Controles de Selección
ListView

1. ArrayAdapter<String> adaptador2 =
new ArrayAdapter<String>(this,
android.R.layout.simple_list_item_1,
datos);

2. ListView lstOpciones =
(ListView)findViewById(R.id.listView);

3. lstOpciones.setAdapter(adaptador2);
Interfaz de Usuario: Controles de Selección
ListView
Interfaz de Usuario: Controles de Selección
ListView
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout

xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical">

<TextView android:id="@+id/LblTitulo"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textStyle="bold"
android:textSize="20sp" />

<TextView android:id="@+id/LblSubTitulo"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textStyle="normal"
android:textSize="12sp" />

</LinearLayout>
Interfaz de Usuario: Controles de Selección
ListView

public class Noticias {

private String titulo;


private String subtitulo;

public Noticias(String tit, String sub){


titulo = tit;
subtitulo = sub;
}

public String getTitulo(){


return titulo;
}

public String getSubtitulo(){


return subtitulo;
}
}
Interfaz de Usuario: Controles de Selección
ListView

class AdaptadorNoticias extends ArrayAdapter<Noticias> {

public AdaptadorNoticias(Context context, Noticias[] datos) {


super(context, R.layout.ly_listanoticias, datos);
}

public View getView(int position, View convertView, ViewGroup parent) {

LayoutInflater inflater = LayoutInflater.from(getContext());


View item = inflater.inflate(R.layout.ly_listanoticias, null);

TextView lblTitulo = (TextView)item.findViewById(R.id.LblTitulo);


lblTitulo.setText(getItem(position).getTitulo());

TextView lblSubtitulo = (TextView)item.findViewById(R.id.LblSubTitulo);


lblSubtitulo.setText(getItem(position).getSubtitulo());

return(item);
}
}
Interfaz de Usuario: Controles de Selección
ListView

public Noticias[] noticias =


new Noticias[]{
new Noticias("Noticia 1", "SubNoticia Contenido Contenido Contenido Contenido 1"),
new Noticias("Noticia 2", "SubNoticia Contenido Contenido Contenido Contenido 2"),
new Noticias("Noticia 3", "SubNoticia Contenido Contenido Contenido Contenido 3"),
new Noticias("Noticia 4", "SubNoticia Contenido Contenido Contenido Contenido 4")};

1. AdaptadorNoticias adaptadornoticias = new AdaptadorNoticias(this,


noticias);

2. ListView lstOpciones = (ListView)findViewById(R.id.listView);

3. lstOpciones.setAdapter(adaptadornoticias);
Interfaz de Usuario: Controles de Selección
ListView

<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/andr
oid"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">

<TextView
android:layout_width="match_parent"
android:layout_height="40dp"
android:text="NOTICIAS UTEQ"
android:textStyle="bold"
android:background="#ff0093ff"
android:gravity="center" />

</LinearLayout>
Interfaz de Usuario: Controles de Selección
ListView

View header =
getLayoutInflater().inflate(
R.layout.ly_cabeceranoticias
, null);

lstOpciones.addHeaderView(he
ader);
Interfaz de Usuario: Controles de Selección
ListView

lstOpciones.setOnItemClickListener(new AdapterView.OnItemClickListener() {

public void onItemClick(AdapterView<?> a, View v, int position, long id) {

Intent intent = new Intent(ViewNews.this, verNoticia.class);

Bundle b = new Bundle();


b.putString("NOMBRE",
((Noticias)a.getItemAtPosition(position)).getTitulo());
intent.putExtras(b);

startActivity(intent);

}
});
Interfaz de Usuario: Controles de Selección
ListView

1. TextView txttituloNoticia =
(TextView)findViewById(R.id.txtTituloNoticia);

2. xttituloNoticia.setText(bundle.getString("NOMBRE
"));
Interfaz de Usuario: Glide
https://github.com/bumptech/glide

Glide is a fast and efficient open source media


management and image loading framework for
Android that wraps media decoding, memory and
disk caching, and resource pooling into a simple and
easy to use interface.

Build.grade
dependencies {
.…
compile 'com.github.bumptech.glide:glide:3.6.1'
}

MainActivity.java

ImageView imageView = (ImageView) findViewById(R.id.imgLogo);


Glide.with(this).load("http://goo.gl/gEgYUd").into(imageView);
Interfaz de Usuario: Glide
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
https://github.com/bumptech/glide
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="horizontal">

<ImageView
android:id="@+id/imgNoticia"
android:layout_width="100dp"
android:layout_height="100dp" />

<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
android:padding="5dp">

<TextView
android:id="@+id/LblFechayCategoria"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="8sp"
android:textStyle="normal" />

<TextView
android:id="@+id/LblTitulo"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="14sp"
android:textStyle="bold" />

<TextView
android:id="@+id/LblSubTitulo"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:textSize="10sp"
android:textStyle="normal" />

</LinearLayout>

</LinearLayout>
Interfaz de Usuario: Glide
public class Noticias {

private String titulo;


private Spanned subtitulo;
private String url;

public Noticias(JSONObject a) throws JSONException {


titulo = a.getString("titu").toString();
subtitulo = Html.fromHtml(a.getString("intr"));
url = "http://www.uteq.edu.ec/images/noticias/" + a.getString("cate") + "/" +
a.getString("codinoti") + ".jpg";

public String getTitulo(){


return titulo;
}

public Spanned getSubtitulo(){


return subtitulo;
}

public String getURL(){ return url; }

public static ArrayList<Noticias> JsonObjectsBuild(JSONArray datos) throws JSONException {

ArrayList<Noticias> noticias = new ArrayList<>();


for (int i = 0; i < datos.length(); i++) {
noticias.add(new Noticias(datos.getJSONObject(i)));
}

return noticias;

}
Interfaz de Usuario: Glide
https://github.com/bumptech/glide

public View getView(int position, View convertView, ViewGroup parent) {

…..
….

ImageView imageView =
(ImageView)item.findViewById(R.id.imgNoticia);
Glide.with(this.getContext())
.load(getItem(position).getURL())
.error(R.drawable.imgnotfound)
.into(imageView);

}
Interfaz de Usuario:
DownloadManager
if (Build.VERSION.SDK_INT >= 23) {
if (checkSelfPermission(android.Manifest.permission.WRITE_EXTERNAL_STORAGE)
== PackageManager.PERMISSION_GRANTED) {
Log.e("Permission error","You have permission");
return true;
} else {

Log.e("Permission error","You have asked for permission");


ActivityCompat.requestPermissions(this, new String[]
{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1);
return false;
}
}
else { //you dont need to worry about these stuff below api level 23
Log.e("Permission error","You already have the permission");
return true;
}
Interfaz de Usuario:
DownloadManager
ImageView imageView = (ImageView)item.findViewById(R.id.imgPDF);
imageView.setTag(getItem(position).getPdfUrl());
imageView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {

String url = v.getTag().toString();


DownloadManager.Request request = new DownloadManager.Request(Uri.parse(url));
request.setDescription("PDF Paper");
request.setTitle("Pdf Artcilee");
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
request.allowScanningByMediaScanner();
request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);
}
request.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, "filedownload.pdf");

DownloadManager manager = (DownloadManager) getContext().getSystemService(Context.DOWNLOAD_SERVICE);


try {
manager.enqueue(request);

} catch (Exception e) {

Toast.makeText(getContext(),
e.getMessage(),
Toast.LENGTH_LONG).show();

}
}
});
Interfaz de Usuario: ActionBar

Lib: appcompat  -- Build.gradle


dependencies {
classpath 'com.android.tools.build:gradle:2.1.0'

/res/values/styles.xml
<resources>

<!-- Base application theme. -->


<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
<!-- Customize your theme here. -->

</style>

</resources>

Interfaz: AppCompatActivity

public class MainActivity extends AppCompatActivity


Interfaz de Usuario: ActionBar
Lib: appcompat  Interfaz: AppCompatActivity

• android:id. El ID
• android:title. El texto que se
visualizará
• android:icon.
• android:showAsAction.
 ifRoom. Se mostrará como botón de
acción sólo si hay espacio
disponible.
 withText. Se mostrará el texto de la
opción junto al icono en el caso de
que éste se esté mostrando como
botón de acción.
 never. menú de overflow.
 always. siempre se mostrará como
Interfaz de Usuario: ActionBar

public class MainActivity extends AppCompatActivity

@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.menu , menu);
return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.action_nuevo:
Log.i("ActionBar", "Nuevo!");
return true;
case R.id.action_buscar:
Log.i("ActionBar", "Buscar!");;
return true;
case R.id.action_settings:
Log.i("ActionBar", "Settings!");;
return true;
default:
return super.onOptionsItemSelected(item);
}
}
Interfaz de Usuario: Image Asset
Interfaz de Usuario: ToolBar
/res/values/styles.xml
<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
</style>

Activity_main.xml
<android.support.v7.widget.Toolbar
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/appbar"
android:layout_height="wrap_content"
android:layout_width="match_parent"
android:minHeight="?attr/actionBarSize"
android:background="?attr/colorPrimary"
android:elevation="4dp"
android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
app:popupTheme="@style/ThemeOverlay.AppCompat.Light" >

</android.support.v7.widget.Toolbar>

Interfaz: AppCompatActivity
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

Toolbar toolbar = (Toolbar) findViewById(R.id.appbar);


setSupportActionBar(toolbar);
}
Interfaz de Usuario: FloatingActionBar
compile 'com.android.support:design:23.3.0'

<android.support.design.widget.FloatingActionButton
android:id="@+id/fab" android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="bottom|end"
android:layout_margin="50dp"
android:src@android:drawable/ic_dialog_email"
android:onClick="onClickFAB"
/>

public void onClick(View view) {


Snackbar.make(view, "Se presionó el FAB", Snackbar.LENGTH_LONG)
.setAction("Action", null).show();
}
Interfaz de Usuario: Navigation View
compile 'com.android.support:design:23.3.0'
compile 'com.android.support:support-v4:23.3.0'

setHomeAsUpIndicator()
drawerLayout.openDrawer(GravityCompat.START);

android.support.v4.widget.DrawerLayout

FrameLayout

android.support.design.widget.NavigationView
Interfaz de Usuario: Navigation View
<android.support.v4.widget.DrawerLayout
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:id="@+id/drawer_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true"
tools:context=".MainActivity">

<!-- Layout real de la actividad -->


<FrameLayout
android:id="@+id/content_frame"
android:layout_width="match_parent"
android:layout_height="match_parent" />

<!-- Layout del menú lateral (Navigation View) -->


<android.support.design.widget.NavigationView
android:id="@+id/navview"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:fitsSystemWindows="true"
android:layout_gravity="start"
app:headerLayout="@layout/cabecera"
app:menu="@menu/menu1" />

</android.support.v4.widget.DrawerLayout>
Interfaz de Usuario: Navigation View
Cabecera.xml

<FrameLayout

xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">

<ImageView
android:layout_width="match_parent"
android:layout_height="200dp"
android:src="@drawable/navheader"
android:scaleType="centerCrop" />

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Cristian"

android:textAppearance="@style/TextAppearance.AppCompat.Large
.Inverse"
android:textStyle="bold"
android:layout_gravity="bottom"
android:layout_marginBottom="10dp"
android:layout_marginLeft="10dp" />
</FrameLayout>
Interfaz de Usuario: Navigation View
menu/menu1
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<group android:checkableBehavior="single">
<item
android:id="@+id/menu_seccion_1"
android:icon="@drawable/menu"
android:title="Sección 1"/>
<item
android:id="@+id/menu_seccion_2"
android:icon="@drawable/menu"
android:title="Sección 2"/>
<item
android:id="@+id/menu_seccion_3"
android:icon="@drawable/menu"
android:title="Sección 3"/>
</group>

<item
android:id="@+id/navigation_subheader"
android:title="Otras Opciones">
<menu>
<item
android:id="@+id/menu_opcion_1"
android:icon="@drawable/menu"
android:title="Opciones 1"/>
<item
android:id="@+id/menu_opcion_2"
android:icon="@drawable/menu"
android:title="Opciones 2"/>
</menu>
</item>
</menu>
Interfaz de Usuario: Navigation View

getSupportActionBar().setHomeAsUpIndicator(R.drawable.menu);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);

@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home:
drawerLayout = (DrawerLayout)findViewById(R.id.drawer_layout);
drawerLayout.openDrawer(GravityCompat.START);
return true;
default:
return super.onOptionsItemSelected(item);
}
}
Interfaz de Usuario: Navigation View
navView = (NavigationView)findViewById(R.id.navview);

navView.setNavigationItemSelectedListener(
new NavigationView.OnNavigationItemSelectedListener() {
@Override
public boolean onNavigationItemSelected(MenuItem menuItem) {

boolean fragmentTransaction = false;


Fragment fragment = null;

switch (menuItem.getItemId()) {
case R.id.menu_seccion_1:
fragment = new Fragment1();
fragmentTransaction = true;
break;
case R.id.menu_seccion_2:
fragment = new Fragment2();
fragmentTransaction = true;
break;
case R.id.menu_seccion_3:
fragment = new Fragment3();
fragmentTransaction = true;
break;
}
if(fragmentTransaction) {
getSupportFragmentManager().beginTransaction()
.replace(R.id.content_frame, fragment)
.commit();
menuItem.setChecked(true);
getSupportActionBar().setTitle(menuItem.getTitle());
}
drawerLayout.closeDrawers();
return true;
}
});
Interfaz de Usuario: Navigation View

<resources>
    <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
        <item name="colorPrimary">@color/color_primary</item>
        <item name="colorPrimaryDark">@color/color_primary_dark</item>
        <item name="colorAccent">@color/color_accent</item>
 
        <item name="android:windowDrawsSystemBarBackgrounds">true</item>
        <item name="android:statusBarColor">@android:color/transparent</item>
    </style>
</resources>
 Google Play Services

compile 'com.google.android.gms:play-services:+
 Google Play Services: Location
Fused Location Provider
Gradel.xml
API: compile 'com.google.android.gms:play-services-location:9.4.0'

AndroidManifest.xml

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

ACCESS_FINE_LOCATION. Permiso para acceder a datos de localización con una precisión alta.
ACCESS_COARSE_LOCATION. Permiso para acceder a datos de localización con una precisión baja.
 Google Play Services: Location
OnCreate
 <TextView android:id="@+id/lblLatitud"
        android:layout_width="wrap_content" lblLatitud = (TextView) findViewById(R.id.lblLatitud);
 lblLongitud = (TextView) findViewById(R.id.lblLongitud);
        android:layout_height="wrap_content"
 btnActualizar = (ToggleButton) findViewById(R.id.btnActualizar);
        android:text="@string/latitud" />
 
    <TextView android:id="@+id/lblLongitud"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/longitud" />
 
    <ToggleButton
android:id="@+id/btnActualizar"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" private void updateUI(Location loc) {
    if (loc != null) {
        android:textOn="@string/         lblLatitud.setText("Latitud: " + String.valueOf(loc.getLatitude()));
parar_actualizaciones"         lblLongitud.setText("Longitud: " + String.valueOf(loc.getLongitude()));
        android:textOff="@string/     } else {
        lblLatitud.setText("Latitud: (desconocida)");
iniciar_actualizaciones" />         lblLongitud.setText("Longitud: (desconocida)");
    }
}
 Google Play Services: Location

GoogleApiClient apiClient = new GoogleApiClient.Builder(this)


    .enableAutoManage(this, this)
    .addConnectionCallbacks(this)
    .addApi(LocationServices.API)
    .build();

Implements Interfaces Override Methods

• OnConnectionFailedListener • onConnectionFailed(ConnectionResult result)


• ConnectionCallbacks • onConnected(@Nullable Bundle bundle)
• onConnectionSuspended(int i)
 Google Play Services: Location
@Override @Override
public void onConnected(@Nullable Bundle public void onRequestPermissionsResult(int requestCode,
bundle) { String[] permissions, int[] grantResults) {
    //Conectado correctamente a Google Play     if (requestCode == PETICION_PERMISO_LOCALIZACION) {
Services         if (grantResults.length == 1
              && grantResults[0] ==
    if (ActivityCompat.checkSelfPermission(this, PackageManager.PERMISSION_GRANTED) {
        Manifest.permission.ACCESS_FINE_LOCATION  
) != PackageManager.PERMISSION_GRANTED) {             //Permiso concedido
   
        ActivityCompat.requestPermissions(this,             @SuppressWarnings("MissingPermission")
            new String[]             Location lastLocation =
{Manifest.permission.ACCESS_FINE_LOCATION},                 LocationServices.FusedLocationApi.getLastLocation
                PETICION_PERMISO_LOCALIZACION); (apiClient);
    } else {  
              updateUI(lastLocation);
        Location lastLocation =  
            LocationServices.FusedLocationApi.getLast         } else {
Location(apiClient);             //Permiso denegado:
              //Deberíamos deshabilitar toda la funcionalidad
        updateUI(lastLocation); relativa a la localización.
    }  
}             Log.e(LOGTAG, "Permiso denegado");
        }
    }
}
 Google Play Services: Maps
MapFragment
Google APIs
https://console.developers.google.com/

Google APIs is a set of application programming interfaces (APIs) developed


by Google which allow communication with Google Services and their
integration to other services. Examples of these include Search, Gmail, Translate
or Google Maps. Third-party apps can use these APIs to take advantage of or
extend the functionality of the existing services
Google APIs
https://console.developers.google.com/

Google Maps Android API


Google APIs
https://console.developers.google.com/
Google APIs
https://console.developers.google.com/
Google APIs : Maps
Gradel.xml
API: compile 'com.google.android.gms:play-services-maps:9.4.0'

AndroidManifest.xml - <application>

<meta-data
    android:name="com.google.android.gms.version"
    android:value="@integer/google_play_services_version" />

<meta-data
    android:name="com.google.android.geo.API_KEY"
    android:value="AIzaSyAbl4F-oTWeHQxC4EljT9V8tNz8kXj0fkc"/>

<uses-feature
    android:glEsVersion="0x00020000"
    android:required="true"/>
Google APIs : Maps
<fragment
xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/map"
    android:name="com.google.android.gms.maps.MapFragment"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

MapFragment mapFragment =
(MapFragment) getFragmentManager()
                .findFragmentById(R.id.map);
 
        mapFragment.getMapAsync(this);

 implements OnMapReadyCallback

@Override
    public void onMapReady(GoogleMap map) {
        mapa = map;
    }
Google APIs : Maps
Tipo de vista
mapa.setMapType(GoogleMap.MAP_TYPE_SATELLITE);
 mapa.getUiSettings().setZoomControlsEnabled(true);

• GoogleMap.MAP_TYPE_NORMAL. Mapa de carreteras normal.


• GoogleMap.MAP_TYPE_SATELLITE. Imágenes de satélite.
• GoogleMap.MAP_TYPE_HYBRID. Una mezcla de los dos
anteriores.
• GoogleMap.MAP_TYPE_TERRAIN. Mapa topográfico.

 public void onClick(View v) {


        cambiarOpciones();
  }
Google APIs : Maps
Movimiento sobre Mapa: Cámaras
moveCamera() animateCamera()

• Latitud-Longitud (target)
• Zoom
• Orientación (bearing)
• Ángulo de visión (tilt)

CameraUpdateFactory.newLatLng(lat, long)

CameraUpdateFactory.zoomIn(). Aumenta en 1 el nivel de


zoom.
CameraUpdateFactory.zoomOut(). Disminuye en 1 el nivel
de zoom.
CameraUpdateFactory.zoomTo(nivel_de_zoom)
Google APIs : Maps
Movimiento sobre Mapa: Cámaras
moveCamera() animateCamera()

• Latitud-Longitud (target)
• Zoom
• Orientación (bearing)
• Ángulo de visión (tilt)

CameraUpdateFactory.newLatLngZoom(lat, long, zoom)

CameraUpdateFactory.scrollBy
(scrollHorizontal, scrollVertical)
Google APIs : Maps
Movimiento sobre Mapa: Cámaras

Movimiento de la Cámara : Madrid

 CameraUpdate camUpd1 =
        CameraUpdateFactory
            .newLatLngZoom(new LatLng(40.41, -3.69), 5);
 
    mapa.moveCamera(camUpd1);
Google APIs : Maps
Movimiento sobre Mapa: Cámaras
Movimiento de la Cámara (Ángulo y Orientación

LatLng madrid = new LatLng(40.417325, -3.683081);

CameraPosition camPos = new CameraPosition.Builder()


.target(madrid)
.zoom(19)
.bearing(45) //noreste arriba
.tilt(70) //punto de vista de la cámara 70 grados
.build();

CameraUpdate camUpd3 =
CameraUpdateFactory.newCameraPosition(camPos);

mapa.animateCamera(camUpd3);
Google APIs : Maps
Movimiento sobre Mapa: Cámaras

Obtener Posición actual de la Cámara

 CameraPosition camPos = mapa.getCameraPosition();


 
    LatLng coordenadas = camPos.target;
    double latitud = coordenadas.latitude;
    double longitud = coordenadas.longitude;
 
    Toast.makeText(this, "Lat: " + latitud + " | Long: " +
longitud, Toast.LENGTH_SHORT).show();
Google APIs : Maps
Movimiento sobre Mapa: Cámaras
OnClick Map -
mapa.setOnMapClickListener(new
GoogleMap.OnMapClickListener() {
    public void onMapClick(LatLng point) {
        Projection proj = mapa.getProjection();
        Point coord = proj.toScreenLocation(point);
 
        Toast.makeText(
            MainActivity.this,
            "Click\n" +
            "Lat: " + point.latitude + "\n" +
            "Lng: " + point.longitude + "\n" +
            "X: " + coord.x + " - Y: " + coord.y,
            Toast.LENGTH_SHORT).show();
    }
});
Google APIs : Maps
Líneas y Polígonos sobre el Mapa
Líneas Pos: 40.41, -3.69

PolylineOptions lineas = new PolylineOptions()


        .add(new LatLng(45.0, -12.0))
        .add(new LatLng(45.0, 5.0))
        .add(new LatLng(34.5, 5.0))
        .add(new LatLng(34.5, -12.0))
        .add(new LatLng(45.0, -12.0));
 
    lineas.width(8);
    lineas.color(Color.RED);
 
    mapa.addPolyline(lineas);
Google APIs : Maps
Líneas y Polígonos sobre el Mapa
Polígono Pos: 40.41, -3.69

PolygonOptions rectangulo = new


PolygonOptions()
        .add(new LatLng(45.0, -12.0),
             new LatLng(45.0, 5.0),
             new LatLng(34.5, 5.0),
             new LatLng(34.5, -12.0),
             new LatLng(45.0, -12.0));
 
    rectangulo.strokeWidth(8);
    rectangulo.strokeColor(Color.RED);
 
    mapa.addPolygon(rectangulo);
Google APIs : Maps
Geofencing
Google APIs : Maps
Geofencing

También podría gustarte