Aumentar la velocidad de compilación en Android Studio


Aumentar la velocidad de Gradle

Se puede agilizar el tiempo de espera a la hora de compilar la App en Android Studio.

Para ello deberemos poner la memoria ram dispnible, se recomienda poner 1/3 de la memoria total que se dispone.

En gradle.propeties agregar la linea

org.gradle.jvmargs=-Xmx3072m

En el app.gradle debajo de SDK versión:

    dexOptions {
        maxProcessCount 2
        javaMaxHeapSize "2g"
    }

Ejemplo entero:

apply plugin: 'com.android.application'
android {
compileSdkVersion 24
buildToolsVersion "24.0.1"
dexOptions {
maxProcessCount 2
javaMaxHeapSize "2g"
}
defaultConfig {
applicationId "com.youcompany.app.testapp"
minSdkVersion 14
targetSdkVersion 24
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
return true
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
exclude group: 'com.android.support', module: 'support-annotations'
})
compile 'com.android.support:appcompat-v7:24.2.1'
compile 'com.android.support:design:24.2.1'
testCompile 'junit:junit:4.12'
}
view raw Ejemplo1.gradle hosted with ❤ by GitHub

Enlaces

Para expandir más información Make Gradle builds great (and fast) again!

Anuncio publicitario

Implementar doble pulsación atrás para salir de la App en Android


Método para integrar un sistema de pulsación doble para salir de la App en Android. Para ello deberemos sobrescribir el evento de llamada onBackPresed()

class MainActivity : AppCompatActivity() {
 
    var lastClickTime: Long = 0
 
...
override fun onBackPressed() {
    if (lastClickTime.plus(2000L) > System.currentTimeMillis()) {
        super.onBackPressed()
    } else {
        Toast.makeText(this, getText(R.string.press_again_exit), Toast.LENGTH_SHORT).show()
        lastClickTime = System.currentTimeMillis()
    }
}

Si se usa el componente Navigation de componentes de arquitectura de Android

private var firstClickTime: Long = 0L
...
override fun onBackPressed() {
        if ((navController.graph.startDestination == navController.currentDestination?.id) && (!shouldBeExit())) {
            toast(R.string.double_back_pressed)
        } else super.onBackPressed()

    }

    private fun shouldBeExit(milSeconds: Long = 2000L): Boolean {
        return if (firstClickTime + milSeconds < System.currentTimeMillis()) {
            firstClickTime = System.currentTimeMillis()
            false
        } else true

    }
@Override
public void onBackPressed() {
DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
if (drawer.isDrawerOpen(GravityCompat.START)) {
drawer.closeDrawer(GravityCompat.START);
} else {
if (firstClickTime + Constants.TIME_INTERVAL > System.currentTimeMillis()) {
super.onBackPressed();
return;
} else {
Toast.makeText(this, getString(R.string.double_back_pressed), Toast.LENGTH_SHORT).show();
}
firstClickTime = System.currentTimeMillis();
}
}

Patrón de navegación en Android


Según la documentación de Google sobre patrones de navegación en Material Design, debemos dar la posibilidad al usuario poder volver hacia atrás, mediante un botón a la barra del título o bien usando el botón (físico,virtual) del propio Sistema Android, más información sobre patrón de navegación hacia atrás.

alt text
Esquema del patrón básico de navegación entre actividades.

Añadir el Botón UP

alt text

El botón UP es el icono de flecha que muchas apps introducen en las actividades para realizar la acción volver a la actividad anterior.

if (getSupportActionBar() != null) {
    getSupportActionBar().setDisplayHomeAsUpEnabled(true);
}

Detectar su pulsación

Código java para detectar la pulsación del Back UP Button:

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    // Handle item selection
    switch (item.getItemId()) {
        case android.R.id.home:
            onBackPressed();
            return true;
        default:
            return super.onOptionsItemSelected(item);
    }
}

Modificar su aspecto

Podemos cambiar el símbolo de la flechita por otro

getSupportActionBar().setHomeAsUpIndicator(R.drawable.ic_close);
o bien usando `style.xml`
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
 <item name="android:homeAsUpIndicator">@drawable/ic_close</item>
</style>

Interceptar evento Ir hacia atrás

alt text

Es posible interceptar la acción ir hacia atrás con el evento onBackPressed, este evento es lanzado cuando se realiza la pulsación:

  • Botón UP dentro de la aplicación.
  • Botón virtual en la barra de navegación del sistema Android.
  • Botón físico ir hacia atrás.
@Override
public void onBackPressed() {
    super.onBackPressed();
    //código al pulsar ir hacia atrás
}

Con la función onBackPressed() podemos iniciar la acción ir hacia atrás des de cualquier parte.

Establecer patrón de navegación

alt text

Si queremos forzar que al pulsar sobre el botón UP su regreso sea una determinada activity, en el archivo AndroidManifest.xml se debe especificar android:parentActivityName la actividad de regreso y también en meta-data.

 <activity
 android:name=".AActivity"
 android:label="@string/title_activity_main2"
 android:parentActivityName=".MainActivity"
 android:theme="@style/AppTheme.NoActionBar">
 <meta-data
 android:name="android.support.PARENT_ACTIVITY"
 android:value="com.webserveis.app.testpatternnavigation.MainActivity" />
 </activity>

Solo con especificar eso, al pulsar sobre el botón UP lo hará automáticamente, en caso interceptar la acción con onOptionsItemSelected deberemos hacer uso de NavUtils.navigateUpFromSameTask(this) para delegar la acción.

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    // Handle item selection
    Log.i(TAG, "onOptionsItemSelected: ");
    switch (item.getItemId()) {
        case android.R.id.home:
            NavUtils.navigateUpFromSameTask(this);
            return true;
        default:
            return super.onOptionsItemSelected(item);
    }
}

Prevenir evento onBackPressed

Si deseamos que al interceptar la acción ir hacia atrás no realice ninguna acción.

@Override
public void onBackPressed() {  }

Material Design Lista simples en Android


Según la documentación de Google sobre Material Design. Una lista consta de una sola columna continua divido por conjunto de filas iguales, que funcionan como contenedores de elementos informativos.

Las listas son adecuadas para la presentación de un tipo de datos homogéneos o conjunto de datos del mismo tipo, puede contener imágenes (iconos,avatares) y texto. Están optimizadas para la comprensión de la lectura , ofrecen diferenciar bien entre tipos de datos similares o sus cualidades dentro de un conjunto de datos.

Lista Simples

Las listas simples solo muestran la información en una sola linea:

Solo texto

alt text

draw_item_single_line_text_only.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
 xmlns:tools="http://schemas.android.com/tools"
 android:layout_width="match_parent"
 android:layout_height="48dp"
 android:background="?android:attr/selectableItemBackground"
 android:paddingEnd="@dimen/list_right_padding"
 android:paddingLeft="@dimen/list_left_padding"
 android:paddingRight="@dimen/list_right_padding"
 android:paddingStart="@dimen/list_left_padding"
 tools:context="com.webserveis.app.detaile.MainActivity">

 <TextView
 android:id="@+id/text"
 android:layout_width="wrap_content"
 android:layout_height="wrap_content"
 android:layout_centerVertical="true"
 android:text="Single-line item"
 android:textColor="?android:textColorPrimary"
 android:textSize="16sp" />

</RelativeLayout>

Con icono y texto

alt text

draw_item_single_line_icon_with_text.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
 xmlns:tools="http://schemas.android.com/tools"
 android:layout_width="match_parent"
 android:layout_height="48dp"
 android:background="?android:attr/selectableItemBackground"
 android:paddingEnd="16dp"
 android:paddingLeft="16dp"
 android:paddingRight="16dp"
 android:paddingStart="16dp"
 tools:context="com.webserveis.app.detaile.MainActivity">

 <ImageView
 android:id="@+id/image"
 android:layout_width="24dp"
 android:layout_height="24dp"
 android:layout_centerVertical="true"
 android:src="@mipmap/ic_launcher"
 android:tint="#666666" />

 <TextView
 android:id="@+id/text"
 android:layout_width="wrap_content"
 android:layout_height="wrap_content"
 android:layout_alignParentLeft="true"
 android:layout_alignParentStart="true"
 android:layout_centerVertical="true"
 android:layout_marginLeft="56dp"
 android:layout_marginStart="56dp"
 android:text="Single-line item"
 android:textColor="?android:textColorPrimary"
 android:textSize="16sp" />

</RelativeLayout>

Avatar con texto

alt text

draw_item_single_line_avatar_with_text.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
 xmlns:tools="http://schemas.android.com/tools"
 android:layout_width="match_parent"
 android:layout_height="56dp"
 android:background="?android:attr/selectableItemBackground"
 android:paddingEnd="16dp"
 android:paddingLeft="16dp"
 android:paddingRight="16dp"
 android:paddingStart="16dp"
 tools:context="com.webserveis.app.detaile.MainActivity">

 <ImageView
 android:id="@+id/image"
 android:layout_width="48dp"
 android:layout_height="48dp"
 android:layout_centerVertical="true"
 android:src="@mipmap/ic_launcher"
 android:tint="#666666" />

 <TextView
 android:id="@+id/text"
 android:layout_width="wrap_content"
 android:layout_height="wrap_content"
 android:layout_alignParentLeft="true"
 android:layout_alignParentStart="true"
 android:layout_centerVertical="true"
 android:layout_marginLeft="56dp"
 android:layout_marginStart="56dp"
 android:text="Single-line item"
 android:textColor="?android:textColorPrimary"
 android:textSize="16sp" />

</RelativeLayout>

Avatar con texto y icono

alt text

draw_item_single_line_avatar_with_text_and_icon.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
 xmlns:tools="http://schemas.android.com/tools"
 android:layout_width="match_parent"
 android:layout_height="56dp"
 android:background="?android:attr/selectableItemBackground"
 android:paddingEnd="16dp"
 android:paddingLeft="16dp"
 android:paddingRight="16dp"
 android:paddingStart="16dp"
 tools:context="com.webserveis.app.detaile.MainActivity">

 <ImageView
 android:id="@+id/image"
 android:layout_width="48dp"
 android:layout_height="48dp"
 android:layout_centerVertical="true"
 android:src="@mipmap/ic_launcher"
 android:tint="#666666" />

 <TextView
 android:id="@+id/text"
 android:layout_width="wrap_content"
 android:layout_height="wrap_content"
 android:layout_alignParentLeft="true"
 android:layout_alignParentStart="true"
 android:layout_centerVertical="true"
 android:layout_marginLeft="56dp"
 android:layout_marginStart="56dp"
 android:layout_toLeftOf="@+id/image2"
 android:layout_toStartOf="@+id/image2"
 android:text="Single-line item"
 android:textColor="?android:textColorPrimary"
 android:textSize="16sp" />

 <ImageView
 android:id="@+id/image2"
 android:layout_width="24dp"
 android:layout_height="24dp"
 android:layout_alignParentEnd="true"
 android:layout_alignParentRight="true"
 android:layout_centerVertical="true"
 android:layout_marginLeft="16dp"
 android:layout_marginStart="16dp"
 android:src="@mipmap/ic_launcher"
 android:tint="#666666" />

</RelativeLayout>

 

Llamar selector de archivos nativo en Android


¿Necesita mostrar el selector de archivos en su aplicación de Android para permitir que los usuarios elijan archivos en su almacenamiento local?

El sistema Android ofrece un selector de archvios de forma nativa, que permite elegir los archivos que están disponibles en su dispositivo, permite la seleción de archivos en todas las ubicaciones posibles, hasta permite obtener archvios de almacenamiento en la nube de google drive. 

Como tambien el tipo de archvio, para imágenes, videos, audios, documentos de texto o otros formatos.

Sigue leyendo «Llamar selector de archivos nativo en Android»