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
Ingeniero en Informática, Investigador, me encanta crear cosas o arreglarlas y darles una nueva vida. Escritor y poeta. Más de 20 APPs publicadas y un libro en Amazon.