2010-03-05 17 views
101

Muy bien, este diseño específico me molesta. Y parece que no se puede encontrar una manera de tener una vista de lista, con una fila de botones en la parte inferior para que la vista de lista no se extienda por encima de los botones, por lo que los botones siempre se ajustan a la parte inferior de la pantalla. Esto es lo que quiero:Diseño de Android con ListView y botones

eliminado ImageShack vínculo roto

Parece que debería ser tan fácil, pero todo lo que he probado ha fallado. ¿Alguna ayuda?

Aquí está mi código actual:

RelativeLayout container = new RelativeLayout(this); 
    container.setLayoutParams(new RelativeLayout.LayoutParams(LayoutParams.FILL_PARENT,LayoutParams.FILL_PARENT)); 

    //** Add LinearLayout with button(s) 

    LinearLayout buttons = new LinearLayout(this); 

    RelativeLayout.LayoutParams bottomNavParams = new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); 
    bottomNavParams.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM); 
    bottomNavParams.addRule(RelativeLayout.CENTER_HORIZONTAL); 
    buttons.setLayoutParams(bottomNavParams); 


    ImageButton newLayer = new ImageButton(this); 
    newLayer.setImageResource(R.drawable.newlayer); 
    newLayer.setLayoutParams(new LinearLayout.LayoutParams(45, LayoutParams.FILL_PARENT)); 
    buttons.addView(newLayer); 

    container.addView(buttons); 

    //** Add ListView 

    layerview = new ListView(this); 

    RelativeLayout.LayoutParams listParams = new RelativeLayout.LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT); 
    listParams.addRule(RelativeLayout.ABOVE, buttons.getId()); 

    layerview.setLayoutParams(listParams); 

    container.addView(layerview); 
+0

Una buena pregunta, muchos desarrolladores se van a quedar atascados en esto. – Signcodeindie

+0

Afortunadamente, el diseñador en Android es bastante dulce. Por lo tanto, al crear un diseño/UI, intente utilizar Designer/XML. Especialmente para este escenario, ya que es simplemente un conjunto de botones y un ListView. – Subby

Respuesta

135

Creo que esto es lo que está buscando.

<?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="fill_parent"> 

    <Button android:layout_width="fill_parent" 
     android:layout_height="wrap_content" android:id="@+id/testbutton" 
     android:text="@string/hello" android:layout_alignParentBottom="true" /> 

    <ListView android:layout_width="fill_parent" 
     android:layout_height="fill_parent" android:id="@+id/list" 
     android:layout_alignParentTop="true" android:layout_above="@id/testbutton" /> 

</RelativeLayout> 
+0

Eso es lo que he estado usando básicamente, aunque estoy escribiendo el diseño en Java. ListView todavía se extiende sobre los botones. – GuyNoir

+1

Lo único que estoy cambiando es que estoy agregando un Diseño relativo alrededor de ListView porque no puedo llamar a addRule (RelativeLayout.ABOVE) en un ListView. – GuyNoir

+2

Este código debería funcionar bien. 'android: layout_above =" @ id/testbutton "' mantendrá el 'ListView' sobre el' Botón'. – CommonsWare

8

La mejor manera es una disposición relativa que fija los botones debajo de la vista de lista. En este ejemplo, los botones también están en un diseño lineal porque es más fácil ponerlos uno al lado del otro en un tamaño igual.

<RelativeLayout android:id="@+id/RelativeLayout01" 
android:layout_width="fill_parent" 
android:layout_height="fill_parent"> 

<ListView android:id="@+id/ListView01" 
android:layout_alignParentTop="true" 
android:layout_width="fill_parent" 
android:layout_height="fill_parent"> 
</ListView> 

<LinearLayout android:id="@+id/LinearLayout01" 
android:layout_below="@+id/ListView01" 
android:layout_width="fill_parent" 
android:layout_height="wrap_content" 
android:layout_alignParentBottom="true"> 
<Button android:id="@+id/ButtonJoin" 
android:text="Join" 
android:layout_width="fill_parent" 
android:layout_height="wrap_content" 
android:layout_weight="1" 
android:layout_alignParentBottom="true"> 
</Button> 
<Button android:id="@+id/ButtonJoin" 
android:layout_alignRight="@id/ButtonCancel" 
android:layout_width="fill_parent" 
android:layout_height="wrap_content" 
android:layout_weight="1" 
android:text="Cancel" 
android:layout_alignParentBottom="true"> 
</Button> 
</LinearLayout> 

</RelativeLayout> 
+0

El problema es que se extiende sobre la parte superior de los botones en la parte inferior si la vista de lista es demasiado larga. No puedo imaginar cómo hacer para que se detenga sobre los botones. – GuyNoir

+2

Si está usando (creo que 1.5, tal vez incluso 1.6) DEBE tener los botones ANTES de ListView cuando usa reglas RelativeLayout; de lo contrario, el diseño aún no tiene conocimiento de los Buttons porque los lee en orden, por lo que su ListView se extiende más allá de ellos. –

+0

Esto no funciona para mí. Como Tim H dice, para mí debo poner ListView después de LinearLayout y luego hacer el ListView layout_above, como la respuesta de repoc anterior. – Nemi

1

Sé que este post es bastante antiguo, pero, para responder a la pregunta de su creador original, la razón del código no funcionó fue buttons.getId() devuelve -1. Si va a hacer esto, debe hacer algo como call buttons.setId (10). Si haces eso, el código funciona bien.

57

Tuve el mismo problema por años.

La solución para mantener el ListView encima de los botones, pero evitando que los cubra cuando la lista es larga, es establecer android: layout_weight = "1.0" en el ListView. Deje el layout_weight en los botones sin ajustar para que permanezcan en su tamaño natural, de lo contrario los botones se escalarán. Esto funciona con LinearLayout.

Hay un ejemplo en los ApiDemos Android: ApiDemos/res/layout/linear_layout_9.xml

+0

solo ahórreme un par de horas más. No pude entender por qué los botones nunca aparecieron. :) – frostymarvelous

+0

No entiendo completamente por qué esto funciona, pero funciona :) – Bevor

20

Sólo estaba buscando una respuesta a esta pregunta y este fue uno de los primeros resultados. Siento como si todas las respuestas, incluida la que actualmente se elige como la "mejor respuesta", no es abordar el problema sobre el que se pregunta. El problema que se plantea es que hay una superposición de los dos componentes Button y ListView en que ListView ocupa toda la pantalla, y el botón flota visualmente sobre (delante de) ListView (vista de bloqueo/acceso de el último elemento en el ListView)

Basado en las respuestas que he visto aquí y en otros foros, finalmente llegué a una conclusión sobre cómo resolver esto.

Originalmente, tenía:

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

    <ListView 
    android:id="@+id/game_list" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:layout_alignParentTop="true" 
    /> 

    <LinearLayout 
    android:orientation="horizontal" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:layout_alignParentBottom="true" 
    style="@android:style/ButtonBar"> 

    <Button 
     android:id="@+id/new_game" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:text="@string/new_game" 
     android:textColor="#FFFFFFFF" 
     android:background="@drawable/button_background" /> 
    </LinearLayout> 

</RelativeLayout> 

Nota el uso de RelativeLayout como el nodo raíz.

Esta es la versión final, que trabajan en la que el botón no se superpone al ListView:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:background="#FF394952"> 

    <ListView 
    android:id="@+id/game_list" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:layout_alignParentTop="true" 
    android:layout_weight="1.0" /> 

    <LinearLayout 
    android:orientation="horizontal" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:layout_alignParentBottom="true" 
    style="@android:style/ButtonBar"> 

    <Button 
     android:id="@+id/new_game" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:text="@string/new_game" 
     android:textColor="#FFFFFFFF" 
     android:background="@drawable/button_background" /> 
    </LinearLayout> 

</LinearLayout> 

Sólo hay dos diferencias. Primero, cambié a usar un LinearLayout.Esto ayudará con el siguiente bit, que fue agregar android:layout_weight a mi ListView

Espero que esto ayude.

+0

Esto resuelve, pero ¿quién podría adivinar? Cuando le das 'android: layout_alignParentBottom' dentro de un padre' LinearLayout', ADT dice "Parámetro de diseño inválido en un LinearLayout: layout_alignParentBottom"! –

0

esto debería funcionar. para tener botones encima de la vista de lista también, coloque los botones dentro de otro diseño lineal.

<LinearLayout> main container // vertical 

<LinearLayout> scrollview must be contained in a linear layout //vertical - height to fill parent 

    <ScrollView> set the height of this to fill parent 

     <ListView> will be contained in the scrollview 
     </ListView> 

    </ScrollView> 

</LinearLayout> 

<LinearLayout> //horizontal - height to wrap content 

<Button> 

</Button> 

</LinearLayout> 

</LinearLayout> 
0

la solución más fácil sería crear dos diseños lineales, uno con el botón y el otro con la vista de lista (contenido de abrigo en el botón de la altura y el padre partido en la altura de diseño de lista). luego solo haga una vista de desplazamiento sobre el diseño con la vista de lista y se ignorará el diseño del botón. Espero que ayude, lo siento, no tuve ganas de escribir el código.

Cuestiones relacionadas