Documentos de Académico
Documentos de Profesional
Documentos de Cultura
/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.
<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" />
</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'
allprojects {
repositories {
jcenter()
}
}
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
@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
SaludoActivity.this, SaludoActivity.this);
3. ws.execute("");
• 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">
<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
@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
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));
}
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));
}
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
return(item);
}
}
Interfaz de Usuario: Controles de Selección
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() {
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
Build.grade
dependencies {
.…
compile 'com.github.bumptech.glide:glide:3.6.1'
}
MainActivity.java
<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 {
return noticias;
}
Interfaz de Usuario: Glide
https://github.com/bumptech/glide
…..
….
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 {
} catch (Exception e) {
Toast.makeText(getContext(),
e.getMessage(),
Toast.LENGTH_LONG).show();
}
}
});
Interfaz de Usuario: ActionBar
/res/values/styles.xml
<resources>
</style>
</resources>
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
@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);
<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"
/>
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">
</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) {
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
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
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);
• Latitud-Longitud (target)
• Zoom
• Orientación (bearing)
• Ángulo de visión (tilt)
CameraUpdateFactory.newLatLng(lat, long)
• Latitud-Longitud (target)
• Zoom
• Orientación (bearing)
• Ángulo de visión (tilt)
CameraUpdateFactory.scrollBy
(scrollHorizontal, scrollVertical)
Google APIs : Maps
Movimiento sobre Mapa: Cámaras
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
CameraUpdate camUpd3 =
CameraUpdateFactory.newCameraPosition(camPos);
mapa.animateCamera(camUpd3);
Google APIs : Maps
Movimiento sobre Mapa: Cámaras