A√ļn no tienes acceso a esta clase

Crea una cuenta y contin√ļa viendo este curso

Reutilizando elementos

19/20
Recursos

Aportes 16

Preguntas 5

Ordenar por:

¬ŅQuieres ver m√°s aportes, preguntas y respuestas de la comunidad? Crea una cuenta o inicia sesi√≥n.

Y cómo haríamos para centrar de nuevo el logo?
O sea, yo lo centré usando un RelativeLayout, poniendo los constraints y en su contenido puse el include, pero no sé si eso también es un anidamiento innecesario.

¬ŅCu√°l ser√≠a la manera correcta?
Así es como lo puse:

    <RelativeLayout
        android:id="@+id/logoContainer"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent">

        <include layout="@layout/merge_logo" />
    </RelativeLayout>

Para centrar el logo, simplemente vamos a merge_logo y ahi agregamos los constraint que centran el view.

Lo que sucede con merge es que android hace de cuenta como si ese ImageView fuera sido declarado dentro de nuestro propio layout donde lo agregamos, el no se da cuenta que viene de otra parte.

Entonces en merge_logo podriamos definir como quiero que se vea mi elemento en los otros layout donde lo voy a invocar.

La diferencia entre Include y Merge es que Include va a halar todos los elementos que ya tengas en el Layout.


Merge: simplemente los va a agregar como si fueran elementos presentes en tu Layout.

La diferencia entre Include y Merge es la forma en la que Android Studio los instancia:
Usando un layout tipo Include, Android Studio crear√° un layout adicional a la hora de referenciar a ese elemento.
Y si extraemos los elementos dentro de un layout tipo Merge, Android Studio los agrega como un elemento normal, sin crear layouts adicionales.

Increible clase

En ocasiones hay elementos de layout que se repiten en muchas vistas o en su defecto en todas. En Android es posible reutilizar estos elementos, para ello hay que hacer lo siguiente:

  1. Poner el elemento que se repite dentro de un nuevo Activity.

    Ejemplo:

    <?xml version="1.0" encoding="utf-8"?>
    <androidx.constraintlayout.widget.ConstraintLayout
        xmlns:android="https://schemas.android.com/apk/res/android" android:layout_width="match_parent"
        xmlns:app="https://schemas.android.com/apk/res-auto"
        android:layout_height="match_parent">
    
        <ImageView
            android:layout_width="@dimen/width_logo"
            android:layout_height="@dimen/height_logo"
            android:contentDescription="@string/description_logo"
            android:src="@drawable/logo"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent" />
    
    </androidx.constraintlayout.widget.ConstraintLayout>
    
  2. A√Īadir ese archivo al layout en el que se quiere usar. Ejemplo:

    <include layout="@layout/include_logo" />
    
  3. Agregar los atributos necesarios para posicionar el elemento de la manera deseada. Ejemplo:

    <include
            android:id="@+id/ivProfileLogo"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            layout="@layout/include_logo" />
    

Usar este método tiene un problema y es que cuando Android resuelva el layout va a tener en este caso un ConstraintLayout que tiene adentro otro ConstraintLayout, lo cuál cusa una anidación de layouts donde no es necesario y una consecuente perdida innecesaria de rendimiento.

Hay una de solucionar esto e incluir un layout dentro de otro sin que se genere una anidación, para conseguir eso hay que hacer lo siguiente:

  1. Poner el elemento que se repite dentro de un nuevo Activity. Este Activity usar√° un ViewGroup <merge>.

    Ejemplo:

    <?xml version="1.0" encoding="utf-8"?>
    <merge
        xmlns:android="https://schemas.android.com/apk/res/android" android:layout_width="match_parent"
        xmlns:app="https://schemas.android.com/apk/res-auto"
        android:layout_height="match_parent">
    
        <ImageView
            android:id="@+id/ivProfileLogo"
            android:layout_width="@dimen/width_logo"
            android:layout_height="@dimen/height_logo"
            android:contentDescription="@string/description_logo"
            android:src="@drawable/logo" />
    
    </merge>
    
  2. A√Īadir ese archivo al layout en el que se quiere usar. Ejemplo:

    <include
            android:id="@+id/ivProfileLogo"
            layout="@layout/merge_logo"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />
    
  3. Agregar los atributos necesarios para posicionar el elemento de la manera deseada. Ejemplo:

    <ImageView
            android:id="@+id/ivProfileLogo"
            android:layout_width="@dimen/width_logo"
            android:layout_height="@dimen/height_logo"
            android:contentDescription="@string/description_logo"
            android:src="@drawable/logo"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent" />
    

Hice esta p√°gina de login:

El include es de este archivo:

Alguien sabe a que se refiere con afectar el √°rbol jerargico de las vistas, me refiero a que cual seria el impacto en este o en el rendimiento de la app?

TIP: puedes agregar el Namespace de app escribiendo appNS en Android Studio y luego d√°ndole a la tecla Tab

De esta manera pude centrar el logo:

<?xml version=‚Äú1.0‚ÄĚ encoding=‚Äúutf-8‚ÄĚ?>
<merge
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height=‚Äúmatch_parent‚ÄĚ>

<ImageView
    android:id="@+id/ivLoginLogo"
    android:layout_width="match_parent"
    android:layout_height="@dimen/height_logo"
    android:src="@drawable/logpa" />

</merge>

Elementos
SI hay un elemento exactamente igual siempre existe un a manera para no tener que tener las mismas lineas repetidas una y otra vez.
Para esto crearemos un layout exclusivamente con ese elemento y para incluirlo usaremos <include layout"@…"/>Es recomendable que el layout nuevo sea un tipo merge, para que no se aniden los layouts, esto sera mejor para andorid

Creo que este componete es muy util para cuando mostramos imagenes en otros activitys, ya que escomo si no estuviera el recuerso o lo entendi mal

A darle atomos

Asi nomas

  • Include trae a tu vista un conjunto de elementos

  • Merge trae las propiedades de los elementos que se utiliza include