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ó:
- Disposición relativa: comportamiento diferente en Api <11
- Programar de forma programada android: layout_centerHorizontal
- ¿Por qué la imagen de nueve parches en RelativeLayour oculta todos los elementos internos?
- Método Onlayout en el diseño personalizado extendiendo RelativeLayout
- Android Scrollview en RelativeLayout con ButtonBar
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?
- ¿Cómo puedo centrar dos TextViews verticalmente dentro de un Layout
- ¿Cómo puedo eliminar mediante programación una regla existente que se definió en XML?
- RelativeLayout centro vertical
- OnClickListener no funciona con el atributo que se puede hacer clic
- RelativeLayout, alinee una vista en la parte inferior de otra vista pero siempre debajo de otra
- Diferencias RelativeLayout entre 1,5 y 2,1
- ¿Cómo poner varias vistas de texto y la vista de la imagen en android?
- ImageView rellena el ancho o altura de los padres, pero mantiene la relación de aspecto
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.
- Android, la mejor manera de proporcionar constantes específicas de la aplicación en un proyecto de biblioteca?
- No se puede ver Nexus 6P para depurar