Bienvenido a Universo Android

Estamos actualizando el sitio web! Pronto subiremos el nuevo diseño de la web! Gracias por su paciencia!

10 Mejores Practicas de Desarrollo en Android

10 Mejores Practicas de Desarrollo en Android

Buenas Practicas de Desarrollo en Android

1. Cambiar a Android Studio

En la pagina oficial de Android declara explícitamente que "Android Studio es ahora el IDE oficial para desarrollo en Android". Si todavía está en Eclipse y esa no es razón suficiente para cambiar de IDE, aquí hay algunas características exclusivas de Android Studio que te harán cambiar de opinión:
  1. Android Studio utiliza el sistema de compilación Gradle . Gradle tiene características como soporte para repositorios Maven , múltiples tipos de compilación, múltiples tipos de aplicaciones (por ejemplo, demo y pago), divisiones de apk (por densidad de pantalla o ABI) y configuraciones de firma de apk personalizadas.
  2. Contiene un creador de 9 parches incorporado.
  3. Puede ver vistas previas de dibujos, cadenas, colores y otros recursos.
  4. Un selector de color para elegir colores en diseños y dibujos.
  5. Casi todos los atajos de navegación y teclado de IntelliJ IDEA .

Además, Google ha finalizado el desarrollo del complemento ADT para Eclipse.

2. Utilizar strings.xml

Agregar texto como recursos de cadena siempre es útil a largo plazo, especialmente cuando se necesita agregar soporte para nuevos idiomas en tu aplicación Android.

Existen tres tipos de recursos String para nuestra aplicación y son los siguientes.

String

Recurso XML que ofrece una sola string.

Ejemplo:

<?xml version="1.0" encoding="utf-8"?> 
<resources> 
    <string 
        name="string_nombre" >text_string</string> 
</resources> 

Matriz de strings

Recurso XML que ofrece una matriz de strings.

Ejemplo:

 <?xml version="1.0" encoding="utf-8"?>
<resources>
    <string-array name="string_anime">
        <item>Dragon Ball</item>
        <item>Naruto</item>
        <item>Bleach</item>
    </string-array>
</resources>
Para utilizarlo en Java.
Resources res = getResources();
String[] planets = res.getStringArray(R.array.string_anime);

Strings de cantidad (plurales)

Recurso XML que conlleva diferentes strings para brindar pluralización.

Ejemplo:

 
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <plurals name="numberOfSongsAvailable">
        <!-
             As a developer, you should always supply "one" and "other"
             strings. Your translators will know which strings are actually
             needed for their language. Always include %d in "one" because
             translators will need to use %d for languages where "one"
             doesn't mean 1 (as explained above).
          -->
        <item quantity="one">%d song found.</item>
        <item quantity="other">%d songs found.</item>
    </plurals>
</resources>

Para utilizarlo en Java.
int count = getNumberOfSongsAvailable(); 
Resources res = getResources(); 
String songsFound = res.getQuantityString(R.plurals.numberOfSongsAvailable, count, count); 

3. Puedes crear diseños separados para los elementos de la IU que se reutilizarán en otros Activity.

La etiqueta <include /> hace posible tener un diseño único, lo puedes reutilizar en múltiples actividades y fragmentos de toda la aplicación.
Por ejemplo, para un botón de estilo único que debe mostrarse en muchas actividades de su aplicación, se puede crear un diseño separado. Ese diseño se puede incluir en el diseño de cada actividad.

Button

<Button
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@drawable/unique_button"
    android:textStyle="bold"
    android:text="Boton Unico" />

Include

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

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal"
        android:text="See button below" />

    <include layout="@layout/boton_unico.xml" />
</LinearLayout>

Otra etiqueta útil es la etiqueta <merge />. Actúa como un pseudo-padre y ayuda a eliminar un ViewGroup raíz innecesario.
Por ejemplo, si su diseño re-utilizable contiene dos botones colocados verticalmente, puede colocarlos dentro de un diseño lineal con una orientación vertical. Pero este LinearLayout se vuelve redundante si el diseño se incluye (usando <include />) en otro LinearLayout. En este caso, nuestro diseño re-utilizable puede tener <merge /> como el ViewGroup raíz en lugar de LinearLayout.

Merge 

<merge xmlns:android="http://schemas.android.com/apk/res/android">
    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal"
        android:text="Submit" />

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal"
        android:text="Reset" />
</merge>
Include
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <EditText
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="Enter text" />

    <include layout="@layout/buttons.xml" />
</LinearLayout>

4. Incluye recursos para pantallas XXHDPI

Muchos dispositivos (y aplicaciones de iniciador) usan iconos de iniciador de la carpeta dibujable xxxhdpi. Además, el LG G3 y Nexus 6 utilizan todos los recursos de las carpetas xxxhdpi. Definitivamente habrá muchos dispositivos xxxhdpi en el futuro. Por lo tanto, debe comenzar a desarrollar el hábito de incluirlos.

5. Coloque los iconos del iniciador en carpetas mipmap

Al construir aplicaciones separadas para diferentes densidades, se eliminan las carpetas dibujables para otras densidades. Esto hará que los iconos aparezcan borrosos en los dispositivos que usan iconos de inicio de mayor densidad.
Dado que las carpetas mipmap no se eliminan, siempre es mejor usarlas para incluir los iconos del iniciador.

6. Use recursos separados para depurar y liberar

Gradle permite configurar tipos de compilación personalizados. Por defecto, se proporcionan dos tipos de compilación, depuración y lanzamiento.
Podemos proporcionar archivos separados (fuente, recursos y activos) para cada tipo de compilación creando sus carpetas correspondientes, adyacentes a la carpeta principal, en la estructura del proyecto. Estas carpetas siguen la misma estructura que main y deben contener solo los archivos primarios.

Un ejemplo de su utilidad es cuando necesita tener un archivo de configuración para Google Analytics. Se pueden crear archivos XML separados que contienen la ID de seguimiento para ambos tipos de compilación. Durante la compilación, el archivo correspondiente a la compilación se extraerá automáticamente.

Algo a tener en cuenta aquí es que siempre se usan archivos / valores de recursos de la carpeta principal. Pero un archivo / valor de recurso en main se anulará si también existe en la carpeta de compilación.

La imagen muestra cómo colocar el archivo de configuración, ga_tracker.xml, para Google Analytics para depurar y liberar tipos de compilación.

ga_tracker.xml en depuración contiene un ID de seguimiento para fines de depuración
ga_tracker.xml en la versión contiene el ID de seguimiento real
ga_tracker.xml contiene el resto de la configuración

7. Use formas y selectores en lugar de imágenes tanto como sea posible

Las formas básicas y los degradados se pueden dibujar fácilmente con la etiqueta <forma /> sin el uso de imágenes. Las formas resultantes que se dibujan siempre son nítidas y no necesitan crearse para múltiples densidades.

Se puede crear un círculo básico de la siguiente manera y guardarlo como circle.xml en la carpeta dibujable

<shape android: shape = "oval">  
     <solido android: color = "# ff01aef0" />  
 </shape> 

La etiqueta <selector /> se puede usar para agregar diferentes estados visuales (como presionado, deshabilitado, marcado) a las Vistas.

Un selector simple, para agregar un fondo de estado presionado a un botón, puede crearse de la siguiente manera y guardarse en la carpeta de elementos extraíbles

<selector xmlns: android = "http://schemas.android.com/apk/res/android">  
     <item android: drawable = "@ drawable / button_pressed" android: state_pressed = "true" />  
     <item android: drawable = "@ drawable / button_normal" />  
</selector> 

8. No agregue el paquete completo de la biblioteca de servicios de Google Play

La biblioteca de Google Play Services es un paquete que contiene todas las bibliotecas nativas de Google para Android. Google también proporciona estas bibliotecas individualmente para que podamos evitar agregar todo el paquete de servicios de Google Play. Se pueden agregar en build.gradle.

Puede encontrar una lista de las bibliotecas disponibles aquí.

9. Use una biblioteca HTTP como Volley, Retrofit

Al crear una aplicación grande, nuestro código de red puede ser enorme debido al código repetitivo. Esto no solo dificulta el mantenimiento, sino que también dificulta la depuración. Las bibliotecas como Volley y Retrofit reducen una gran cantidad de código repetitivo y tenemos menos cosas de las que preocuparnos.

10. Use la clase Parcelable en lugar de Serializable al pasar datos en Intents / Bundles

La serialización de un objeto que implementa la interfaz Parcelable es mucho más rápida que el uso de la serialización predeterminada de Java.

Una clase que implementa la interfaz serializable se marca como serializable y Java la serializa utilizando la reflexión (lo que la hace lenta).

Cuando se usa la interfaz Parcelable, todo el objeto no se serializa automáticamente. Más bien, podemos agregar selectivamente datos del objeto a una Parcela usando la cual el objeto se deserializa más tarde.

Como crear un documento PDF en Android

Como crear un documento PDF en Android

Como crear un documento PDF en Android

Hola amigos vamos a aprender a como crear un documento PDF en nuestra aplicación Android. De forma muy funcional para imprimir reportes para nuestros clientes.


Como crear RecyclerView Swipe en Android

Como crear RecyclerView Swipe en Android

Android Swipe Example

Hola amigos continuamos con este curso de aplicaciones Android y les traemos este control practico para nuestras aplicaciones podrán implementarlo como quieran para el uso de ListView.

Como utilizar Google Maps en Android

Como utilizar Google Maps  en Android

Android Google Maps Example

Hola amigos en esta ocasión les traemos un tutorial para aprender a utilizar el API de Google Maps en Android poco a poco iremos subiendo mas tutoriales sobre el uso del mismo para darle mas funcionalidades en nuestra aplicación.

Google Maps

Vamos a conseguir la API_KEY para nuestro ejemplo (Aquí)

Como crear un proyecto en Android (Aquí)

Vamos a crear nuestro proyecto para nuestra aplicación Google Maps.

Diseño aplicación Google Maps en Android

Vamos a agregar el diseño para nuestra aplicación y nos quedaría de la siguiente manera.

<?xml version="1.0" encoding="utf-8"?>
<fragment xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:map="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/map"
    android:name="com.google.android.gms.maps.SupportMapFragment"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MapsActivity" />

Y ahora en la carpeta Values el archivo google_maps_api contendrá nuestra API KEY de Google.

<resources>
    <string name="google_maps_key" templateMergeStrategy="preserve" translatable="false">YOUR_KEY</string>
</resources>

Y para nuestro archivo Androidmanifes.xml nos quedara de la siguiente manera.

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.hn.universoandroid.example_google_maps">
    <!--
         The ACCESS_COARSE/FINE_LOCATION permissions are not required to use
         Google Maps Android API v2, but you must specify either coarse or fine
         location permissions for the 'MyLocation' functionality.
    -->
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    <uses-permission android:name="android.permission.INTERNET" />

    <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">
        <!--
             The API key for Google Maps-based APIs is defined as a string resource.
             (See the file "res/values/google_maps_api.xml").
             Note that the API key is linked to the encryption key used to sign the APK.
             You need a different API key for each encryption key, including the release key that is used to
             sign the APK for publishing.
             You can define the keys for the debug and release targets in src/debug/ and src/release/.
        -->
        <meta-data
            android:name="com.google.android.geo.API_KEY"
            android:value="@string/google_maps_key" />

        <activity
            android:name=".MapsActivity"
            android:label="@string/title_activity_maps">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

Código de Google Maps en Android

Ahora el código de nuestra aplicación Android utilizando Google Maps nos quedaría de la siguiente manera.
import android.support.v4.app.FragmentActivity;
import android.os.Bundle;
import com.google.android.gms.maps.CameraUpdateFactory;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.OnMapReadyCallback;
import com.google.android.gms.maps.SupportMapFragment;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.MarkerOptions;

public class MapsActivity extends FragmentActivity implements OnMapReadyCallback {

    private GoogleMap mMap;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_maps);
        // Obtain the SupportMapFragment and get notified when the map is ready to be used.
        SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
                .findFragmentById(R.id.map);
        mapFragment.getMapAsync(this);
    }

    /**
     * Manipulates the map once available.
     * This callback is triggered when the map is ready to be used.
     * This is where we can add markers or lines, add listeners or move the camera. In this case,
     * we just add a marker near Sydney, Australia.
     * If Google Play services is not installed on the device, the user will be prompted to install
     * it inside the SupportMapFragment. This method will only be triggered once the user has
     * installed Google Play services and returned to the app.
     */
    @Override
    public void onMapReady(GoogleMap googleMap) {
        mMap = googleMap;

        // Add a marker in Sydney and move the camera
        LatLng sydney = new LatLng(-34, 151);
        mMap.addMarker(new MarkerOptions().position(sydney).title("Marker in Sydney"));
        mMap.moveCamera(CameraUpdateFactory.newLatLng(sydney));
    }
}

Y listo ya podremos ejecutar nuestra aplicación.

Como crear un emulador AVD (Aquí)

Vamos a crear un emulador AVD para ver nuestra aplicación en ejecución.

Gracias amigos y esperen el contenido nuevo. Déjanos saber tu opinión sobre este tutorial gracias.

Como crear una aplicación Multi-language en Android

Como crear una aplicación Multi-language en Android

Android Multilanguage Example

Hola amigos en esta ocasión les mostrare como crear una aplicación multilanguage en Android
ya que Android cuenta con soporte para muchos lenguajes del mundo.

Como crear un proyecto en Android (Aquí)

Vamos a crear un proyecto en Android para poder desarrollar nuestra aplicación.
Y aprender como podemos hacer que nuestra aplicación sea multilanguage.

Como crear un Table Layout en Android

Como crear un Table Layout en Android

Android Table Layout Example

Hola amigos en esta ocasión les traemos el tutorial para crear una tabla de datos en nuestro Android para que podamos usarlo en nuestras aplicaciones y mostrar de una mejor manera nuestra información.

Como crear un Proyecto en Android (Aquí)

Vamos a crear un proyecto para nuestro Table Layout y desarrollarlo paso a paso.

Como crear un RecyclerView Search en Android

Como crear un RecyclerView Search en Android

Android RecyclerView Search Example

Hola amigos en esta ocasión les traigo el tutorial siguiente que es crear un RecyclerView con buscador de palabras.

Como crear un proyecto en Android (Aquí)

Vamos a crear un proyecto para desarrollar nuestro ejemplo de un RecyclerView con buscador de palabras.

Diseño RecyclerView Search en Android

Vamos a crear el diseño de nuestra aplicación pero para ello debemos tener agregada nuestra dependencia que puede varia en la versión de Android Studio que tengas ya sea con Implementación o Compile.

compile 'com.android.support:recyclerview-v7:+'
compile 'com.android.support:cardview-v7:23.+'

y ahora agregaremos los siguientes controles a nuestro activity_main.xlm.

<?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="match_parent"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity">

    <EditText
        android:id="@+id/edtSearch"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="Buscar" />

    <android.support.v7.widget.RecyclerView
        android:id="@+id/recyclerView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_below="@+id/edtSearch"
        >
    </android.support.v7.widget.RecyclerView>
   
</RelativeLayout>

Y el diseño nos quedaría así.

Vamos a seguir con nuestra aplicación. Tenemos añadiro nuestro EditText que utilizaremos para hacer el filtro de las palabras que deseamos buscar en nuestro RecyclerView.
Ahora añadiremos un archivo mas para que nuestro RecyclerView tenga contenido que mostrar y le pondremos list_row.xml.



<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical">

    <android.support.v7.widget.CardView
        android:layout_marginTop="5dp"
        android:layout_marginBottom="5dp"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <TextView
            android:id="@+id/textRow"
            android:padding="15dp"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />

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

</LinearLayout>
Y el diseño nos quedaría de la siguiente forma.
y continuaremos.

Código de RecyclerView Search en Android

Ahora vamos a crear el código de nuestro RecyclerView para buscar las palabras crearemos la clase necesaria es un adaptador y en nuestra clase principal.

Añadiremos una clase y le daremos un Extends de la clase RecyclerView.Adapter<CustomAdapter.ViewHolder> para nuestro filtro de palabras.

import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import java.util.ArrayList;

public class CustomAdapter extends RecyclerView.Adapter<CustomAdapter.ViewHolder> {
    private ArrayList<String> names;

    public CustomAdapter(ArrayList<String> names) {
        this.names = names;
    }

    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View v = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.list_row, parent, false);
        return new ViewHolder(v);
    }

    @Override
    public void onBindViewHolder(ViewHolder holder, int position) {
        holder.textViewName.setText(names.get(position));
    }

    @Override
    public int getItemCount() {
        return names.size();
    }

    class ViewHolder extends RecyclerView.ViewHolder {
        TextView textViewName;

        ViewHolder(View itemView) {
            super(itemView);

            textViewName = (TextView) itemView.findViewById(R.id.textRow);
        }
    }
   
    public void filterList(ArrayList<String> filterdNames) {
        this.names = filterdNames;
        notifyDataSetChanged();
    }
}

Teniendo listo esto vamos a la clase MainActivity y añadiremos lo siguiente para nuestro ejemplo.

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.text.Editable;
import android.text.TextWatcher;
import android.widget.EditText;
import java.util.ArrayList;

public class MainActivity extends AppCompatActivity {

    RecyclerView recyclerView;
    EditText editTextSearch;
    ArrayList<String> names;
    CustomAdapter adapter;

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

        names = new ArrayList<>();

        names.add("Naruto");
        names.add("One Piece");
        names.add("Dragon Ball");
        names.add("Berserk");
        names.add("Gintama");
        names.add("Nanatsu No taizai");
        names.add("Black Jack");
        names.add("Death Note");
        names.add("Code Geass");
       
        recyclerView = (RecyclerView) findViewById(R.id.recyclerView);
        editTextSearch = (EditText) findViewById(R.id.edtSearch);

        recyclerView.setHasFixedSize(true);
        recyclerView.setLayoutManager(new LinearLayoutManager(this));

        adapter = new CustomAdapter(names);
        recyclerView.setAdapter(adapter);

        editTextSearch.addTextChangedListener(new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {

            }

            @Override
            public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {

            }

            @Override
            public void afterTextChanged(Editable editable) {
                //Despues de que se escribe algo filtra
                filter(editable.toString());
            }
        });

    }

    private void filter(String text) {
        //Nuevo elemento de tipo lista
        ArrayList<String> filterdNames = new ArrayList<>();

        //Ciclo que busca los elementos en la lista
        for (String s : names) {
            //Si existe el elemento en la lista lo mostrara
            if (s.toLowerCase().contains(text.toLowerCase())) {
                //Añadir el elemento a la lista
                filterdNames.add(s);
            }
        }

        // Llamar al metodo filtro de la lista
        adapter.filterList(filterdNames);
    }

}

Y listo.

Como crear un Emulador AVD en Android (Aquí)

Vamos a crear un emulador para ejecutar nuestra aplicación del RecyclerView Search.

RecyclerView Search filtrando los elementos al escribir en el EditText
Y listo tendremos nuestro RecyclerView listo para filtrar nuestro contenido.
Referencia: SimplifiedCoding

Google se enfrenta a una demanda de 9.000 millones por usar Java sin permiso en Android

Android se ha convertido en el sistema operativo móvil por excelencia. En sus casi 10 años de existencia Google ha pasado a dominar este segmento, con un sistema operativo muy polivalente y que usan prácticamente todos los fabricantes del mundo. Sin embargo, un litigio legal con Oracle lleva casi una década generándole dolores de cabeza a la compañía, y finalmente éste podría acabar en el pago de9.000 millones de dólares en daños por su uso de Java.

El litigio de Google y Oracle de 2010 por Java vuelve a la vida

Así lo ha afirmado la Corte de Apelaciones de Estados Unidos hace unas horas, dándole la razón a Oracle y determinando que el uso que Google hizo del código de Java en Android no era justo. La cantidad determinada por la Corte es la que Oracle pedía en 2016, ya que afirman que los 21.000 millones de dólares que Google ha obtenido de beneficios con Android no habrían sido obtenidos si no llega a ser por su código.

Las 50 mejores frases de la programación

Las 50 mejores frases de la programación



50. Actualmente programar es una carrera entre los ingenieros en software por hacer grandes y mejores programas a prueba de idiotas, contra el universo que se empeña en hacer mas grandes y mejores idiotas. Por ahora, el universo gana por lejos.
- Rick Cook

49. Lisp no es un lenguaje, en un material de construcción (no conozco lisp, no entendí esta)
- Alan Kay.


48. Caminar sobre agua y desarrollar software en base a una especificación es sencillo, si ambos están congelados.
- Edward V Berard

47. Ya no hacen más los bugs como bunny
- Olav Mjelde.

46. Un lenguaje de programación es de bajo nivel cuando requiere que prestes atencion a lo irrelevante.
- Alan J. Perlis.

45. Un programa en C es como un baile rápido en una pista de baile recién encerado por personas que llevan navajas de afeitar
- Waldi Ravens.