Crear un Objeto en Android con View incluida para añadirla en cualquier Activity

Tiempo de lectura: 3 minutos

Muchas veces queremos crear un objeto que tiene una vista incluida (hace referencia a un Layout). Por ejemplo un menú inferior qué queremos mostrar en todas las Activitys o una capa.

En este tutorial, os voy a enseñar cómo crear un Objeto reutilizable para cualquier proyecto y qué además se añada en la pantalla que queramos, de forma automática.

Primero comenzamos creando el Layout que representa la View (vista) de nuestro objeto. En este ejemplo voy a añadir un TextView muy sencillo.

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/capaHelloWorld"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_alignParentTop="true">

    <TextView
        android:id="@+id/texto_helloWorld"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        android:text="Hello World" />

</RelativeLayout>

En este ejemplo, hemos creado una capa que muestra un texto «Hello World» en la parte superior de una capa RelativeLayout.

Ahora vamos a crear un objeto que contendrá el Layout creado y podremos utilizar para añadirlo en cualquier Activity.Lo llamamos HelloWorldObj.java.

public class HelloWorldObj{

    //Para guardar el Context de la activity que va a mostrar el objeto
    private Context cnt;
    //Guarda la View que vamos a crear dentro del objet
    private View view;

}

Además, creamos dos atributos de clase, cnt que hace referencia al Context de la Activity que va a invocar a nuestro objeto y view que contendrá la vista del XML que hemos creado en el paso anterior.

Ahora creamos el constructor y asignamos el Layout creado anteriormente.

public class HelloWorldObj{
 
    //Para guardar el Context de la activity que va a mostrar el objeto
    private Context cnt;
    //Guarda la View que vamos a crear dentro del objet
    private View view;

    //Constructor, recibe el parámetro Context
    public HelloWorldObj(Context cnt) {
        this.cnt = cnt;
        //Creamos la vista, para ello obtenemos la activity del context que invoca al objeto 
        //y el RootView de la activity que quiere mostrar esta vista
        this.view = ((Activity) cnt).findViewById(android.R.id.content).getRootView();
        //Asignamos el objeto al principio de todas las capas de la vista de la activity donde queremos añadirla
        ViewGroup viewGroup = (ViewGroup) ((ViewGroup) ((Activity) cnt).findViewById(android.R.id.content)).getChildAt(0);
        //Asignamos el layout creado al objeto
        view.inflate(cnt, R.layout.texto_modo_demo, viewGroup);
    }
}

Ahora voy a explicar un poco el código que he añadido.

Primero se crea el constructor y se le pasa el parámetro Context para poder utilizar y hacer referencia a elementos de la Activity dónde llamamos al objeto public HelloWorldObj(Context cnt).

En la línea this.view = ((Activity) cnt).findViewById(android.R.id.content).getRootView(); obtenemos el contenido (Layout) de la Activity dónde queremos añadir este objeto con vista incluida. Es cómo si de forma automática obtendramos el Layout asignado a la Activity dónde queremos mostrar este objeto.

Después ViewGroup viewGroup = (ViewGroup) ((ViewGroup) ((Activity) cnt).findViewById(android.R.id.content)).getChildAt(0); obtenemos el «espacio o hueco» dónde vamos a añadir nuestro objeto. En este caso quiero mostrarlo por encima de todas las capas, para ello se obtiene primer elemento .getChildAt(0).

Ahora asignamos el Layout del objeto al «espacio» seleccionado sobre el Layout de la Activity que invoca al objeto: view.inflate(cnt, R.layout.texto_modo_demo, viewGroup);

Y solo nos falta mostrarlo en nuestra Activity.

Para ello añadimos lo siguiente en el onCreate():

...
 @Override
    protected void onCreate(final Bundle savedInstanceState) {
        //Para que nuestro objeto pueda funcionar correctamente
        //es importante añadir la View antes de invocarlo:
        setContentView(R.layout.main_activity);

        //Ahora simplemente con invocar al objeto tendremos nuestro Layout 
        //añadido al Layout main_activity (tenemos que pasar el context poniendo this)
        new HelloWorldObj(this);
}
...

Simplemente con invocar al objeto creado, ya añadimos la vista a la Activity que queramos.

Utilizando este tutorial podrás crear Objetos o Liberías que se auto-añadan a la Activity que necesites.

Os recomiento la librería MagicSnack creada con esta técnica: https://github.com/IsMMA/MagicSnackBar

Deja un comentario