Pregunta

Tengo un diseño relativo como el siguiente:

<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 agregar una vista a la izquierda de la vista de 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 la vista de lista en alinearParentRight, funcionará.¿Es esto un error de Android o me falta algo?

Siempre lo intento addView(View child, int index, LayoutParams params), pero es posible que solo funcione en el diseño lineal.Entonces, ¿existe una solución normal para hacer el RelativeLayout.LEFT_OF ¿trabajar?

EDITAR

Yo he tratado RelativeLayout.BELOW y RelativeLayout.RIGHT_OF, y funcionaron perfectamente, entonces ¿significa que no tengo suficiente lugar para colocar el botón?Intenté darle más espacio, pero todavía no funciona.

Utilizo Toshiba AT100 (1280*800) y horizontal, por lo que hay suficiente espacio.Prueba below y right igual que el left.Creo que si pongo un control A en el diseño relativo, luego agrego el control B y decaleo que está a la izquierda del control A, el resultado debería ser que el control B empujará el control A hacia su derecha, ¿verdad?

¿Fue útil?

Solución

Creo que si coloco un control A en el diseño relativo, luego agrego el control B y declaro que está a la izquierda del control A, el resultado debería ser que el control B empujará el control A hacia su derecha, ¿verdad?

Su suposición es incorrecta, el control A no se empujará hacia la derecha a menos que lo especifique con un RelativeLayout.LayoutParams regla. RelativeLayout coloca a sus hijos uno encima del otro comenzando en la esquina superior izquierda de la pantalla si no especifica reglas de ubicación para ellos.Cuando agregas el View una a la RelativeLayout sin reglas (como layout_alignParentRight) se colocará comenzando desde la esquina superior izquierda de la pantalla.Luego, cuando agregas el View B, la regla to_leftOf se aplicará a esto View posición pero esta regla no significa nada para el View Un que mantendrá su posición en la pantalla.esto hará View B debe estar ubicado a la izquierda de View A pero fuera de la pantalla como View Un límite comienza desde el borde izquierdo de la pantalla.

El Button se colocará a la izquierda del ListView cuando usas layout_alignParentRight="true" porque ahora hay espacio para ver realmente el Button(ya no está afuera). addView(View child, int index, LayoutParams params) trabaja en un LinearLayout porque el LinearLayout organiza sus elementos secundarios en una fila o columna (según la orientación), de modo que cuando agrega un View en una posición específica, empujará al otro Views después a la derecha o abajo (dependiendo de la orientación) (no hay posicionamiento relativo de las vistas en un LinearLayout, la única regla es que los niños vengan uno detrás del otro).

Comenzando con el ListView sin reglas establecidas, aquí hay un ejemplo de cómo hacer el Button aparecer a la izquierda del 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á normalmente a la pantalla y aparecerá comenzando desde la esquina superior izquierda de la pantalla.Sin las dos líneas del código encima del Button y ListView se superpondrán ya que este es el comportamiento normal de RelativeLayout para niños sin reglas sobre ellos.Luego modificamos explícitamente la posición del ListView para moverlo hacia la derecha (con las dos últimas líneas del código anterior).

Otros consejos

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

Esta línea es de la que estoy hablando:

m_linearLayout.addView(button2, layoutParams);

EDITAR

Tu dices alignParentRight obras...la única diferencia es que ot no toma un parámetro de anclaje.Tal vez m_listView.getId() no devuelve la identificación adecuada.Puede pasar por el depurador y ver si devuelve un valor adecuado.

Tal vez podrías intentar llamar a la identificación específicamente...

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

Para realizarlo, utilice la vista predefinida. IDENTIFICACIÓN o declarar uno.En carpeta de valores crear ids.xml luego agrega un Artículo como esto:

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

use esta identificación 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 usar directamente esta función Ver.generarViewId() para realizar el mismo.Como esto:

imageView.setId(View.generateViewId());

Creo que quizás te hayas olvidado de agregar m_listView hacia RelativeLayout o m_listViewLa visibilidad sería GONE.

¿Puedes comprobarlo?

setId antes de llamar a align, especialmente para la nueva vista de objeto.

Si está utilizando una identificación personalizada y no una identificación de Android generada habitualmente (p. ej. R.id.my_id), asegúrese de que la identificación no sea igual a 0 (o negativa), de lo contrario se ignorará la regla.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top