2012-08-27 10 views
7

que tienen una actividad con la siguiente distribución:RelativeLayout Gravity no aplicado?

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:tools="http://schemas.android.com/tools" 
android:id="@+id/testlayoutOverlays" 
android:layout_width="fill_parent" 
android:layout_height="fill_parent" > 

<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:id="@+id/testlayoutMain" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:orientation="vertical" > 

    <RelativeLayout 
     android:id="@+id/testlayout_bottom" 
     android:layout_width="fill_parent" 
     android:layout_height="62dp" 
     android:background="#122334" > 

     <ImageView 
      android:id="@+id/testbtnBlock" 
      android:layout_width="60dp" 
      android:layout_height="60dp" 
      android:layout_alignParentLeft="true" 
      android:layout_gravity="left|center_vertical" 
      android:contentDescription="Test1" 
      android:padding="@dimen/padding_medium" 
      android:src="@drawable/btnblock" /> 

     <TextView 
      android:id="@+id/testtxtZoomPan" 
      android:layout_width="fill_parent" 
      android:layout_height="wrap_content" 
      android:layout_centerVertical="true" 
      android:layout_toLeftOf="@+id/testbtnX" 
      android:layout_toRightOf="@+id/testbtnBlock" 
      android:gravity="center_horizontal" 
      android:text="@string/txtZoomPan" 
      android:textColor="#FFFFFF" /> 

     <ImageView 
      android:id="@+id/testbtnX" 
      android:layout_width="60dp" 
      android:layout_height="60dp" 
      android:layout_alignParentRight="true" 
      android:layout_gravity="right|center_vertical" 
      android:contentDescription="Test2" 
      android:padding="@dimen/padding_medium" 
      android:src="@drawable/btnx" /> 
    </RelativeLayout> 

    <LinearLayout 
     xmlns:android="http://schemas.android.com/apk/res/android" 
     xmlns:tools="http://schemas.android.com/tools" 
     android:id="@+id/testlayoutPuzzleInfo" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:layout_marginBottom="10dp" 
     android:orientation="horizontal" > 

     <LinearLayout 
      xmlns:android="http://schemas.android.com/apk/res/android" 
      xmlns:tools="http://schemas.android.com/tools" 
      android:id="@+id/testlayoutChronoErrors" 
      android:layout_width="fill_parent" 
      android:layout_height="wrap_content" 
      android:orientation="vertical" > 

      <Chronometer 
       android:id="@+id/testchronometer" 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       android:layout_weight="0" 
       android:format="@string/chronometer_initial_format" 
       android:gravity="center" /> 

      <LinearLayout 
       xmlns:android="http://schemas.android.com/apk/res/android" 
       xmlns:tools="http://schemas.android.com/tools" 
       android:id="@+id/testlayoutErrors" 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       android:orientation="horizontal" > 

       <ImageView 
        android:layout_width="1px" 
        android:layout_height="20dp" /> 
      </LinearLayout> 
     </LinearLayout> 
    </LinearLayout> 
</LinearLayout> 

</RelativeLayout> 

y el siguiente código:

package minmaxdev.android.picrossanywhere; 

import android.os.Bundle; 
import android.app.Activity; 
import android.content.Intent; 
import android.view.Gravity; 
import android.view.Menu; 
import android.view.MenuItem; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.Button; 
import android.widget.ImageView; 
import android.widget.RelativeLayout; 
import android.support.v4.app.NavUtils; 

public class TestActivity extends Activity { 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_test); 

    // Capture our button from layout 
    ImageView button = (ImageView) findViewById(R.id.testbtnBlock); 
    // Register the onClick listener with the implementation above 
    button.setOnClickListener(new View.OnClickListener() { 
     public void onClick(View arg0) { 
      RelativeLayout rv = (RelativeLayout) findViewById(R.id.testlayoutOverlays); 
      rv.setGravity(Gravity.CENTER); 

      Button btnRetry = new Button(TestActivity.this); 
      btnRetry.setId(R.id.btnRetry); 
      btnRetry.setBackgroundResource(R.drawable.btnselector); 
      RelativeLayout.LayoutParams prmBtn = new RelativeLayout.LayoutParams(Util.DPsToPixels(200, getResources()), Util.DPsToPixels(40, getResources())); 
      prmBtn.setMargins(0, 120, 0, 0); 
      btnRetry.setLayoutParams(prmBtn); 
      // btnRetry.setGravity(Gravity.CENTER_HORIZONTAL); 
      btnRetry.setText("Retry"); 
      btnRetry.setOnClickListener(new ImageView.OnClickListener() { 
       public void onClick(View v) { 
        Intent intent = getIntent(); 
        finish(); 
        startActivity(intent); 
       } 
      }); 
      rv.addView(btnRetry); 
     } 

    }); 
} 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    getMenuInflater().inflate(R.menu.activity_test, menu); 
    return true; 
} 
} 

me gustaría saber: ¿Por qué es mi botón creado de forma dinámica (llamado btnRetry) que no aparecen en el centro de la pantalla, ya que establecí la gravedad RelativeLayout padre en el centro con rv.setGravity(Gravity.CENTER)?

Muchas gracias por su tiempo

+0

Posible duplicado de [Android problema de disposición relativa con la gravedad] (http://stackoverflow.com/questions/2804411/android-relative-layout-problem-with-gravity) –

Respuesta

13

La respuesta es fácil. La gravedad funciona para el contenido, layout_gravity para la vista que usa eso. Fuente básicamente: https://stackoverflow.com/a/3482757/180538

Intente utilizar LayoutParams con addRule(RelativeLayout.CENTER_IN_PARENT, RelativeLayout.TRUE);

Para responder a su entender la gravedad: Tienes razón, pero supongo que esta información en el documentation es importante:

Nota que desde RelativeLayout considera que el posicionamiento de cada niño relativo entre sí es significativo, establecer la gravedad afectará el posicionamiento de todos los niños como una sola unidad dentro del padre. Esto sucede después de que los niños han estado relativamente posicionados.

No puedo probar su diseño por el momento, pero creo que el momento en que se aplica la gravedad no crea el resultado esperado.

Personalmente, utilizaría la gravedad solo en LinearLayouts y el centerInParent para RelativeLayouts.

+0

Hola y gracias! Parece que funciona ... algunas preguntas para ayudarme a entender mejor: dijiste que Gravity funciona para el contenido ... en mi ejemplo, ¿no es mi botón "el contenido" de RelativeView? – ibiza

+0

También tuve que usar addRule en su lugar, que solo tiene 1 parámetro. ¿Existe la función setRule? ¿Cuál sería el significado del segundo parámetro? – ibiza

+0

Modifiqué puede responder. Tienes razón, debe ser 'addRule()'. Ambos métodos están disponibles, uno con un parámetro y otro con dos parámetros. Preferiría usar el segundo (ver mi respuesta). – WarrenFaith

Cuestiones relacionadas