2011-11-25 30 views
19

Tengo el siguiente XML. Estoy tratando de crear un botón estático debajo de mi ScrollView. Intenté establecer los pesos, establecer el botón debajo de la vista de desplazamiento, etc. ¿Alguien puede darme la posibilidad de que el botón permanezca en la parte inferior y que la vista de desplazamiento solo ocupe el centro de la pantalla?¿Cómo hacer un botón estático debajo de un ScrollView?

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



    <LinearLayout 
     xmlns:android="http://schemas.android.com/apk/res/android" 
     android:id="@+id/menuButtons" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:gravity="center_horizontal"> 

     <Button xmlns:android="http://schemas.android.com/apk/res/android" 
      android:id="@+id/newItems" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:text="New Items" /> 
     <Button xmlns:android="http://schemas.android.com/apk/res/android" 
      android:id="@+id/categories" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:text="Categories" /> 

    </LinearLayout> 


    <ScrollView 
     xmlns:android="http://schemas.android.com/apk/res/android" 
     android:id="@+id/contentScroller" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:layout_below="@id/menuButtons"> 

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


      <TableLayout 
       xmlns:android="http://schemas.android.com/apk/res/android" 
       android:layout_width="fill_parent" 
       android:layout_height="wrap_content" 
       android:stretchColumns="1" > 


       <TableRow android:layout_marginTop="5dip" 
          android:layout_marginBottom="5dip" > 
        <ImageView 
         android:src="@drawable/thumbdrive"/>" 
        <TextView 
         android:layout_column="1"    
         android:text="Thumb Drives"    
         android:padding="3dip" 
         android:textSize="20dip"/> 
       </TableRow> 
       <TableRow android:layout_marginTop="5dip" 
          android:layout_marginBottom="5dip"> 
        <ImageView 
         android:src="@drawable/laptop"/> 
        <TextView 
         android:layout_column="1" 
         android:text="Laptops" 
         android:padding="3dip" 
         android:textSize="20dip"/> 
       </TableRow> 
       <TableRow android:layout_marginTop="5dip" 
          android:layout_marginBottom="5dip"> 
        <ImageView 
         android:src="@drawable/sdcard"/> 
        <TextView 
         android:layout_column="1" 
         android:text="SD Cards" 
         android:padding="3dip" 
         android:textSize="20dip"/> 
       </TableRow> 
       <TableRow android:layout_marginTop="5dip" 
          android:layout_marginBottom="5dip"> 
        <TextView 
         android:layout_column="1" 
         android:text="Other" 
         android:padding="3dip" 
         android:textSize="20dip"/> 
       </TableRow> 
       <TableRow android:layout_marginTop="5dip" 
          android:layout_marginBottom="5dip"> 
        <TextView 
         android:layout_column="1" 
         android:text="Other" 
         android:padding="3dip" 
         android:textSize="20dip"/> 
       </TableRow> 
       <TableRow android:layout_marginTop="5dip" 
          android:layout_marginBottom="5dip"> 
        <TextView 
         android:layout_column="1" 
         android:text="Other" 
         android:padding="3dip" 
         android:textSize="20dip"/> 
       </TableRow> 
       <TableRow android:layout_marginTop="5dip" 
          android:layout_marginBottom="5dip"> 
        <TextView 
         android:layout_column="1" 
         android:text="Other" 
         android:padding="3dip" 
         android:textSize="20dip"/> 
       </TableRow> 
       <TableRow android:layout_marginTop="5dip" 
          android:layout_marginBottom="5dip"> 
        <TextView 
         android:layout_column="1" 
         android:text="Other" 
         android:padding="3dip" 
         android:textSize="20dip"/> 
       </TableRow> 
       <TableRow android:layout_marginTop="5dip" 
          android:layout_marginBottom="5dip"> 
        <TextView 
         android:layout_column="1" 
         android:text="Other" 
         android:padding="3dip" 
         android:textSize="20dip"/> 
       </TableRow> 
      </TableLayout> 
     </LinearLayout> 
    </ScrollView> 

    <Button 
     android:id="@+id/submit" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignParentBottom="true" 
     android:layout_centerHorizontal="true" 
     android:text="Submit New Item" 
     android:layout_below="@id/contentScroller"/> 

</RelativeLayout> 
+0

Solucioné exactamente el mismo problema ayer, pero me encontré con otro truco, Sólo por curiosidad, ¿Podría decirme qué es lo visual en modo horizontal? Gracias – tuandroid

+0

Se ve bien en el paisaje. – kieblera5

Respuesta

29

Utilice un RelativeLayout. Comenzar con el Button en la parte inferior, y la posición del ScrollView por encima de la Button.

Relative Layout - Android Developers

<RelativeLayout 
    (...)> 

    <LinearLayout android:id="@+id/ll1" 
     android:layout_alignParentTop="true" 
     (...)/> 

    <Button android:id="@+id/button" 
     android:layout_alignParentBottom="true" 
     (...)/> 

    <ScrollView 
     android:layout_above="@id/button" 
     android:layout_below="@id/ll1" 
     (...)/> 

</RelativeLayout> 

Algo como esto. Escrito de mi cabeza, por lo que algunos errores pueden ocurrir.

+0

Gracias. Lo había intentado antes, pero tenía el botón después de la vista de desplazamiento, así que no funcionó, pero funciona de la manera en que lo escribiste. – kieblera5

+1

Esto hará que el 'RelativeLayout' se estire hasta el fondo de su contenedor. Esto puede estar bien. _Nota que no se puede tener una dependencia circular entre el tamaño de la RelativeLayout y la posición de sus hijos. Por ejemplo, no se puede tener un RelativeLayout cuya altura se establece en WRAP_CONTENT y un niño fijó a ALIGN_PARENT_BOTTOM._ - [RelativeLayout Referencia] (http://developer.android.com/reference/android/widget/RelativeLayout.html) – jtooker

+0

perfecta uno para mi problema ... (y) – Elizabeth

0

lugar el botón en un RelativeLayout y alinearla a la parte inferior de los padres:

<RelativeLayout android:layout_alignParentBottom="true" android:layout_width="fill_parent" android:orientation="horizontal" 
    android:layout_height="50px"> 
<Button 
    android:id="@+id/submit" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_alignParentBottom="true" 
    android:layout_centerHorizontal="true" 
    android:text="Submit New Item" 
    android:layout_below="@id/contentScroller"/> 
</RelativeLayout> 
48

Sé que esto es muy tarde, pero no hay una solución mejor. El problema con el enfoque RelativeLayout y la alineación de los botones en la parte inferior del diseño relativo es que obliga a que la altura del diseño sea esencialmente la misma que fill_parent (o match_parent).

La manera apropiada de hacer esto es como sigue:

<LinearLayout 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent"> 

    <ScrollView 
     android:layout_width="match_parent" 
     android:layout_height="0dp" 
     android:layout_weight="1" 
     android:fillViewport="true"> 
      <!-- Your Scrollview content goes here --> 
    </ScrollView> 
    <Button 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_gravity="center_horizontal" 
     android:gravity="center_horizontal" 
     android:text="Button Text Goes Here" /> 
</LinearLayout> 

La clave es establecer la altura a 0 y luego darle un peso distribución de 1 ... De lo que puedo decir de la lectura para arriba en el proceso de dimensionamiento del diseño, dándole un tamaño de 0 y un peso de diseño hace que se detenga en el tamaño de la vista hasta que haya procesado a todos los niños en el diseño ... Luego da la vuelta en un segundo pase y es capaz para ajustar el tamaño de la vista de desplazamiento correctamente

+3

¡Excelente gracias! Funcionó perfectamente para mí (todavía no me he familiarizado con los diseños relativos). – IanB

+0

Gracias. Su solución me permitió tener una la (exterior) 'LinearLayout' a ** ** No estirar todo el camino hasta el fondo de su recipiente si el contenido del' ScrollView' eran pocos (corto) pero no muestra correctamente el 'Button' debajo sin aplastarlo a' 1px' (como cuando usas 'RelativeLayout' y tienes el' Button' debajo del 'ScrollView'). Si no se preocupan por el 'LinearLayout' se extiende hacia abajo todo el camino (es decir, siempre que se extiende el área de desplazamiento para llenar tanto espacio como sea posible) algunas de las otras soluciones parecen más claro para mí. – jtooker

+3

La mejor solución que he visto hasta ahora. –

Cuestiones relacionadas