La regla relativa de RelativeLayout "RelativeLayout.LEFT_OF" no funciona

Tengo un relativeLayout como abajo:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="horizontal" android:id="@+id/parent" > <ListView android:layout_width="360dp" android:layout_height="600dp" android:id="@+id/list" android:inputType="text" android:maxLines="1" android:layout_margin="50dp" android:layout_alignParentRight="true" /> </RelativeLayout> 

En el código java, quiero añadir una vista a la izquierda de la lista, pero no funcionó:

 m_relativeLayout = (RelativeLayout)findViewById(R.id.parent); RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT); layoutParams.addRule(RelativeLayout.LEFT_OF, m_listView.getId()); Button button2 = new Button(this); button2.setText("I am button 2"); m_relativeLayout.addView(button2, layoutParams); 

Sólo si configuro listview para alignParentRight , funcionará. ¿Es esto un error de Android o me falta algo?

Siempre intento addView(View child, int index, LayoutParams params) , pero puede que sólo funcione en el linearlayout. Entonces, ¿existe una solución normal para que el RelativeLayout.LEFT_OF funcione?

EDITAR

He intentado RelativeLayout.BELOW y RelativeLayout.RIGHT_OF , y funcionaron perfectamente, así que significa que no tengo bastante lugar para conseguir el botón? Traté de dar más espacio, pero todavía no funciona.

Uso Toshiba AT100 (1280 * 800) y el paisaje, por lo que el espacio es suficiente. Prueba below y right justo igual que la left . Creo que si pongo un control A en el relativelayout, entonces agrego el control B y decalare está a la izquierda del control A, el resultado debe ser el control B empujará el control A a su derecha, ¿verdad?

Creo que si pongo un control A en el relativelayout, entonces agrego el control B y declaro que está a la izquierda del control A, el resultado debe ser el control B empujará el control A a su derecha, ¿verdad?

Su suposición es incorrecta, el control A no será empujado hacia la derecha a menos que haya especificado esto con una regla RelativeLayout.LayoutParams . RelativeLayout coloca a sus hijos uno encima de otro comenzando en la esquina superior izquierda de la pantalla si no especifica reglas de ubicación para ellos. Cuando agrega la View A al RelativeLayout sin reglas (como layout_alignParentRight ), se colocará a partir de la esquina superior izquierda de la pantalla. A continuación, cuando agregue la View B, la regla to_leftOf se aplicará a esta posición View , pero esta regla no significa nada para la View A que mantendrá su posición en la pantalla. Esto hará que la View B quede a la izquierda de la View A pero fuera de la pantalla como View A comienza desde el borde izquierdo de la pantalla.

El Button se colocará a la izquierda del ListView cuando use layout_alignParentRight="true" porque ahora hay espacio para ver el Button (ya no está fuera). addView(View child, int index, LayoutParams params) funciona en LinearLayout porque LinearLayout organiza a sus hijos en una fila o columna (dependiendo de la orientación) de modo que al agregar una View en una posición específica, empujará las otras Views después de ella A la derecha o abajo (dependiendo de la orientación) (no hay posicionamiento relativo de las vistas en LinearLayout , la única regla es que los niños vienen uno tras otro).

A partir de ListView sin ninguna regla establecida en él, aquí es un ejemplo de cómo hacer que el Button aparezca a la izquierda de ListView :

 RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT); Button button2 = new Button(this); button2.setText("I am button 2"); button2.setId(1000); m_relativeLayout.addView(button2, layoutParams); RelativeLayout.LayoutParams rlp = (RelativeLayout.LayoutParams) m_listView .getLayoutParams(); rlp.addRule(RelativeLayout.RIGHT_OF, button2.getId()); 

El botón se agregará de forma normal a la pantalla y aparecerá a partir de la esquina superior izquierda de la pantalla. Sin las dos líneas del código por encima del Button y ListView se superponen ya que este es el comportamiento normal de RelativeLayout para los niños sin ninguna regla en ellos. A continuación, modificamos explícitamente la posición del ListView para moverlo a la derecha (con las dos últimas líneas del código anterior).

Si los nombres de las variables son indicativos, es porque agrega el widget a LinearLayout, por lo que las etiquetas de RelativeLayout se ignoran.

Esta línea es la que estoy hablando:

 m_linearLayout.addView(button2, layoutParams); 

EDITAR

Usted dice que alignParentRight funciona … la única diferencia es que ot no toma un parámetro de anclaje. Tal vez m_listView.getId() no está devolviendo el id adecuado. Usted podría pasar con el depurador y ver si está devolviendo un valor adecuado.

Tal vez usted podría tratar de llamar a la identificación específicamente …

 layoutParams.addRule(RelativeLayout.LEFT_OF, R.id.list); 

Para realizarla, utilice una ID de vista predefinida o declare una. En la carpeta de valores cree ids.xml y luego agregue un elemento como este:

 <item name="imageViewID" type="id"/> 

Utilice este id en su código donde está creando una nueva instancia de vista como esta:

 RelativeLayout layout=new RelativeLayout(context); ImageView imageView = new ImageView(context); imageView.setId(R.id.imageViewID); RelativeLayout.LayoutParams layoutParams = new LayoutParams(50, 50); layoutParams.addRule(RelativeLayout.CENTER_HORIZONTAL); layout.addView(imageView, layoutParams); TextView textView = new TextView(context); RelativeLayout.LayoutParams textViewParams= new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); textViewParams.addRule(RelativeLayout.CENTER_HORIZONTAL); textViewParams.addRule(RelativeLayout.BELOW, imageView.getId()); layout.addView(nameView, nameLayoutParams); 

O podemos utilizar directamente esta función View.generateViewId () para realizar la misma. Me gusta esto:

 imageView.setId(View.generateViewId()); 

Pienso que usted pudo haber olvidado agregar m_listView a la visibilidad RelativeLayout o la visibilidad de m_listView sería GONE .

¿Puede usted comprobar por eso?

SetId antes de que se llame, especialmente para la nueva vista de objeto.

Si está usando un ID personalizado y no un ID de Android generado regularmente (por ejemplo, R.id.my_id ), asegúrese de que el id no es igual a 0 (o negativo), de lo contrario se ignorará la regla.

  • Agregar dinámicamente vista a la parte inferior de RelativeLayout
  • Cómo hacer una barra de progreso mostrar en la parte superior de un botón en android
  • Problema con RelativeLayout cuando View visibility es View.GONE
  • "FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS" afecta a getRootView (). GetHeight ()
  • Cómo poner una vista sobre otros en el diseño relativo de forma programática en android?
  • RelativeLayout - Desplazamiento hacia abajo
  • Anula la onMeasure () de RelativeLayout para restringir su relación de aspecto
  • Android - ¿Cómo se especifica el peso mediante programación para un RelativeLayout?
  • Alinear los controles uno junto al otro en un diseño relativo
  • Cómo identificar una vista en el diseño?
  • Programar el atributo AlignParentRight al botón en RelativeLayout no funciona?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.