Layout con botones anclados al final

xMarston

Buenas,

Tengo un problemilla de layouts en Android, extrañamente en Android 5 funciona correctamente pero en las versiones inferiores no. El layout en concreto consiste en un Toolbar (no da ningún tipo de probelmas), un ImageView que ocupa toda la vista y un LinearLayout anclado al bottom con dos botones dentro de Validar y Cancelar.

Como he dicho, en Android 5 los botones si son clickables, no hay ningún tipo de problema pero en versiones inferiores a la 5 los botones no responden. Pongo el código del layout y como se visualiza ese layout (sin la imagen ya que ésta es una que el usuario hace):

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:gravity="center"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

<android.support.v7.widget.Toolbar
    android:id="@+id/toolbar_photo"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="@color/backgroundToolbar"
    android:minHeight="?android:attr/actionBarSize"
    app:popupTheme="@style/Theme.AppCompat"
    app:theme="@style/ToolbarTheme"/>

<ImageView
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/imageZoom" />

<LinearLayout
    android:id="@+id/ll01"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_gravity="bottom">
    <Button
        android:id="@+id/validate_map"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:text="@string/label_ok"
        android:layout_weight="1"
        android:layout_margin="5dp"
        android:onClick="acceptClick"/>

    <Button
        android:id="@+id/cancel_map"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:text="@string/label_cancel"
        android:layout_weight="1"
        android:layout_margin="5dp"
        android:onClick="cancelClick"/>
</LinearLayout>

</FrameLayout>

El problema creo que está en que el ImageView se posiciona por encima del LinearLayout y no deja interactuar con los botones que lo componen. He probado cambiando el FrameLayout por un Linear, Relative, etc.. y el comportamiento es el mismo.

A ver si a alguien se le ocurre una solución, ¡gracias!

Daredevil

Revisa cómo tienes implementado los listeners a mi el layout me funciona perfectamente en versiones anteriores.

1 respuesta
xMarston

#2 Tengo las funciones creadas acceptClick y cancelClick en la Activity pero bueno, probaré a coger los botones en el onCreate y le pondre el onClickListener ahí.

1 respuesta
Querosvan

#3 te ha funcionado poniendo los listeners en la clase? Es por mirar si no qué puede ser

1 respuesta
xMarston

#4 Sí, en el onCreate de la Activity cojo los botones y le meto los listeners y funciona perfecto. ¿A qué se debe que no funcionen directamente asignándole el onClick desde el XML?

1 respuesta
Querosvan

#5 eso iba a mirar. de todas maneras nunca he sido partidario de declarar los métodos en el XML. será que me acostumbré al inicio y lo hacía en la clase y como nunca ha fallado...

1 respuesta
Tig

Es normal que el ImageView se ponga por encima de los botones, le estás diciendo que ocupe todo el padre. Posiblemente en Android 5 funcione por temas de la coordenada Z.

Lo más fácil es que uses un relativelayout

<relative>
<toolbar 
alignParentTop=true>
<LinearLayout 
alignParentBottom=true>
<ImageView 
layout_above=id_linear_layout 
layout_below=id_toolbar>
</relative>

Como te dice #6, no uses el onClick en el XML. Hay que evitar que la vista sepa de la lógica. Si cambias el nombre del método, te toca cambiar el xml. Te recomiendo que mires ButterKnife para evitar tener que asociar las vistas y los listeners.

1 respuesta
xMarston

#7 sí, al final metí la lógica en la clase y listo. Justamente hoy había leído algo sobe ButterKnife y ha sido decirlo tu y decidirme a indagar un poco más y oye, ¡es genial!

hit69

Por que no cambias de Layout?

1 respuesta
xMarston

#9 Al final cambié el layout por un RelativeLayout y a parte de que funciona perfectamente es más fácil de entender el posicionamiento de los elementos.