2011-02-13 23 views
82

Soy nuevo en el desarrollo de Android y tengo una pregunta sobre cómo establecer el peso en un diseño lineal.Android Layout Weight

Estoy tratando de crear una fila con dos botones personalizados y un texto de edición personalizado. El texto de edición solo debe ocupar tanto espacio como su contenido, y los dos botones deben expandirse horizontalmente para llenar el resto del espacio disponible en la fila. Así ...

| [#Button++#] [#Button--#] [et] | 

Después de varios intentos esto es lo más cerca que puedo llegar a lo que quiero, a pesar de que parece demasiado complicado.

| [Button] [Button] [###ET###] | 

<LinearLayout 
    android:orientation="horizontal" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:gravity="center_horizontal|center_vertical" 
    android:layout_weight="1" 
    > 

    <LinearLayout 
     android:orientation="horizontal" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:layout_weight="1" 
     android:gravity="center_horizontal|center_vertical" 
     > 
     <RelativeLayout 
      android:id="@+id/btn_plus_container" 
      android:layout_width="fill_parent" 
      android:layout_height="wrap_content" 
      > 
      <ImageButton 
       android:layout_height="wrap_content" 
       android:layout_width="fill_parent" 
       android:id="@+id/btn_plus" 
       android:background="@drawable/btn" 
       android:layout_centerInParent="true" 
       ></ImageButton> 
      <TextView 
       android:textColor="#FAFAF4" 
       android:id="@+id/tv_dice_plus" 
       android:text="@string/tv_plus" 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       android:layout_centerInParent="true" 
       ></TextView> 
     </RelativeLayout> 
    </LinearLayout> 
    <LinearLayout 
     android:orientation="horizontal" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:layout_weight="1" 
     android:gravity="center_horizontal|center_vertical" 
     > 
     <RelativeLayout 
      android:id="@+id/btn_minus_container" 
      android:layout_width="fill_parent" 
      android:layout_height="wrap_content" 
      > 
      <ImageButton 
       android:layout_height="wrap_content" 
       android:layout_width="fill_parent" 
       android:id="@+id/btn_minus" 
       android:background="@drawable/btn" 
       android:layout_centerInParent="true" 
       ></ImageButton> 
      <TextView 
       android:textColor="#FAFAF4" 
       android:id="@+id/btn_minus" 
       android:text="@string/tv_minus" 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       android:layout_centerInParent="true" 
       ></TextView> 
     </RelativeLayout> 
    </LinearLayout> 
    <LinearLayout 
     android:orientation="horizontal" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:layout_weight="1" 
     android:gravity="center_horizontal|center_vertical" 
     > 
     <EditText 
      android:textColor="#FAFAF4" 
      android:text="@string/et_output" 
      android:id="@+id/et_output" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:inputType="number" 
      android:selectAllOnFocus="true" 
      android:minWidth="50sp"   
      android:maxWidth="50sp" 
      android:background="@drawable/tv_black_background3" 
      android:textColorHighlight="#c30505" 
      ></EditText> 
    </LinearLayout> 
</LinearLayout> 

como lo entiendo ajustar [androide: layout_weight = "2"] para los diseños lineales que llevan a cabo los botones deben hacer que ocupan más espacio que la edición de texto, pero se hace lo contrario para mí, haciéndolos a los dos de la mitad del tamaño.

| [Btn] [Btn] [#####et#####] | 

He intentado tantas combinaciones diferentes que ni siquiera puedo recordarlas, y ninguna ha funcionado.

Respuesta

211

No funciona porque está utilizando fill_parent como el ancho . El peso se usa para distribuir el espacio vacío restante o quitar espacio cuando la suma total es mayor que LinearLayout. Establezca sus anchos en 0dip en su lugar y funcionará.

+6

Ajuste de las anchuras de los diseños lineales a 0dip trabajó como quería. No sabía que era una opción. Tiene sentido por qué eso funcionaría donde wrap_content no. Establecer el ancho de wrap_content cuando no hay contenido hace que desaparezca, pero establecerlo en 0dip permite que se extienda desde cero hasta lo más grande que deba ser. Muchas gracias. – UnluckyDevil

+3

+1 por esta respuesta. ¡Estaba teniendo el peor momento que alguna vez intenté hacer que las pesas funcionaran! – Snailer

+0

Establecer layout_width a "fill_parent" y layout_weight a un valor flotante como "0.2", "0.85" etc. también funciona. En este caso, cuanto mayor sea el número, menor será el tamaño de la vista. ¿podría explicar si esta es una forma aceptable de hacerlo? – Yar

0

i supondría para ajustar el ancho de EditText s a wrap_content y poner los dos botones en una LinearLayout cuya anchura es fill_parent y el peso establecido en 1.

2

Los valores de peso 0-1 comparten la distribución del espacio disponible (después de establecer layout_width = "0px") en proporción al valor del peso. Los elementos de vista con peso no especificado (sin entrada de peso) obtienen peso 0 lo que significa que no obtienen expansión.

Una alternativa simple sin entradas peso necesario es conectar marquesina a una vista con el texto que le indica que debe expandirse desde mínimo necesario para el texto (wrap_content) al espacio disponible EditarTexto: androide: layout_width = "wrap_content" androide: ellipsize = "carpa"

14

android:Layout_weight se puede utilizar cuando no se adjunta un valor fijo a su anchura ya como fill_parent etc.

hacer algo como esto:

<Button> 

Android:layout_width="0dp" 
Android:layout_weight=1 

-----other parameters 
</Button> 
7

creo que de esa manera, será más simple

Si tiene 3 botones y sus pesos son 1,3,1 consecuencia, que funcionará como tabla en HTML

proporcionan 5 porciones de esa línea : 1 porción para el botón 1, 3 porción para el botón 2 y 1 porción para el botón 1

0

Una razón más que encontré (por vago que pueda parecer). Lo de abajo no funcionó.

LinearLayout vertical de

LinearLayout altura fillparent + peso

LinearLayout altura fillparent + peso

LinearLayout altura fillparent + peso

EndLinearLayout

Lo que hizo el trabajo era

RelativeLayout

LinearLayout verticales

LinearLayout altura fillparent + Peso

LinearLayout altura fillparent + Peso

LinearLayout altura fillparent + Peso

EndLinearLayout

EndRelativeLayout

Suena vaga por un diseño raíz con Lineal y pesos menores no funcionó. Y cuando digo "no funcionó", quiero decir, que después de ver el diseño gráfico entre varias resoluciones, la consistencia de la pantalla se rompió a lo grande.

3

En linearLayout configure WeightSum = 2;

Y distribuya el peso a sus hijos como desee que se muestren .. He dado weight = "1" al niño. De modo que ambos distribuirán la mitad del total.

<LinearLayout 
    android:id="@+id/linear1" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:weightSum="2" 
    android:orientation="horizontal" > 

    <ImageView 
     android:id="@+id/ring_oss" 
     android:layout_width="0dp" 
     android:layout_height="wrap_content" 
     android:layout_weight="1" 
     android:src="@drawable/ring_oss" /> 

    <ImageView 
     android:id="@+id/maila_oss" 
     android:layout_width="0dp" 
     android:layout_height="wrap_content" 
     android:layout_weight="1" 
     android:src="@drawable/maila_oss" /> 
</LinearLayout> 
0
<LinearLayout 
    android:id="@+id/linear1" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:weightSum="9" 
    android:orientation="horizontal" > 

    <ImageView 
     android:id="@+id/ring_oss" 
     android:layout_width="0dp" 
     android:layout_height="wrap_content" 
     android:layout_weight="3" 
     android:src="@drawable/ring_oss" /> 

    <ImageView 
     android:id="@+id/maila_oss" 
     android:layout_width="0dp" 
     android:layout_height="wrap_content" 
     android:layout_weight="3" 
     android:src="@drawable/maila_oss" /> 
<EditText 
     android:id="@+id/edittxt" 
     android:layout_width="0dp" 
     android:layout_height="wrap_content" 
     android:layout_weight="3" 
     android:src="@drawable/maila_oss" /> 
</LinearLayout>