2010-10-03 15 views
8

Quiero agregar una vista dentro de un FrameLayout programáticamente y colocarlo en un punto específico dentro del diseño con un ancho y alto específicos. ¿FrameLayout es compatible con esto? Si no, ¿debería usar un ViewGroup intermedio para lograr esto?Vista de lugar dentro de FrameLayout en Android

int x; // Can be negative? 
int y; // Can be negative? 
int width; 
int height; 
View v = new View(context); 
// v.setLayoutParams(?); // What do I put here? 
frameLayout.addView(v); 

Mi idea inicial fue la de añadir un AbsoluteLayout a la FrameLayout y colocar la vista en el interior del AbsoluteLayout. Lamentablemente, descubrí que AbsoluteLayout está en desuso.

Cualquier puntero será muy apreciado. Gracias.

+0

¿Ha resuelto ese problema de alguna manera? Estoy interesado en una solución que no sea AbsoluteLayout :) – WarrenFaith

Respuesta

2

¡Es Es cierto que con FrameLayout todos los niños están vinculados a la esquina superior izquierda de la pantalla, pero aún tienes cierto control al configurar su relleno.Si establece diferentes valores de relleno para diferentes niños, aparecerán en diferentes lugares en FrameLayout.

+8

Pero el problema con esto es que los oyentes de clics abarcarán toda el área desde la esquina superior izquierda ... – Pepster

0

El hilo aquí en StackOverflow en

How do you setLayoutParams() for an ImageView?

cubre un poco. Por ejemplo: LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams (30, 30); yourImageView.setLayoutParams (layoutParams);

implica que debe definir un objeto LinearLayout.LayoutParams (o en su caso un objeto FrameLayout.layoutParams) para pasar al método setLayoutParams de su objeto v.

En

http://developer.android.com/reference/android/widget/FrameLayout.html

casi hace que parece que se puede pedir a su v a:

generateDefaultLayoutParams() a través de este método si no ha definido los parámetros específicamente.

Pero es tarde, y esos enlaces me están haciendo sangrar un poco los ojos. Déjame saber si Nhelp cualquier :-)

1

Desde el link Quinn1000 proporcionado:

Se pueden añadir varios hijos a una FrameLayout, pero todos los niños están vinculadas a la parte superior izquierda de la pantalla.

Esto significa que no puede colocar su Vista en un punto específico dentro de FrameLayout (excepto que desea que esté en la esquina superior izquierda :-)).

Si necesita el posicionamiento absoluto de la vista, probar el AbsoluteLayout:

Un diseño que le permite especificar la ubicación exacta (x/y) las coordenadas de sus hijos. Los diseños absolutos son menos flexibles y más difíciles de mantener que otros tipos de diseños sin un posicionamiento absoluto.

Como para establecer el ancho y la altura de la vista, también como Quinn1000 dijo, usted indica el método de v.setLayoutParams() un objeto LayoutParams, dependiendo del recipiente elegido (AbsoluteLayout, LinearLayout, etc.)

+2

Desafortunadamente AbsoluteLayout está en desuso. – hpique

+0

Tienes razón. Me perdí eso cuando miré la API más temprano. Supongo que podría jugar con margin-left/top para su View dentro de FrameLayout para obtener una experiencia similar a AbsoluteLayout. –

+0

¿Cómo puedo hacer eso programáticamente? – hpique

10

El siguiente ejemplo (código de trabajo) muestra cómo colocar una vista (EditText) dentro de un FrameLayout. También se muestra cómo ajustar la posición de la EditarTexto usando la incubadora setPadding del FrameLayout (cada vez que el usuario hace clic en el FrameLayout, la posición de la EditarTexto se establece en la posición del clic):

public class TextToolTestActivity extends Activity{ 
    FrameLayout frmLayout; 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     frmLayout = (FrameLayout)findViewById(R.id.frameLayout1); 
     frmLayout.setFocusable(true); 
     EditText et = new EditText(this); 

     frmLayout.addView(et,100,100); 
     frmLayout.setOnTouchListener(new OnTouchListener() { 

      @Override 
      public boolean onTouch(View v, MotionEvent event) { 
       Log.i("TESTING","touch x,y == " + event.getX() + "," +  event.getY()); 
       frmLayout.setPadding(Math.round(event.getX()),Math.round(event.getY()) , 0, 0); 
      return true; 
     } 
    }); 

} 

}

main.xml

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" android:layout_width="fill_parent" 
    android:layout_height="fill_parent"> 
    <FrameLayout 
     android:id="@+id/frameLayout1" 
     android:layout_height="fill_parent" android:layout_width="fill_parent"> 
    </FrameLayout> 

</LinearLayout> 
+0

¿Cómo se relaciona esto con la pregunta? – zeh

+2

Bueno ... es una vista dentro de un Framelayout ¿no? Además, estoy mostrando cómo posicionar la vista incrustada en un lugar específico usando el setPadding setter. – tulio84z

+0

Tiene razón. Me perdí parte de tu respuesta. – zeh

1

también puede añadir un margen alrededor de la vista que acaba de agregar a posicionarlo dentro de la FrameLayout.

FrameLayout frameLayout = (FrameLayout) findViewById(R.id.main); // or some other R.id.xxx 
DisplayMetrics metrics = context.getResources().getDisplayMetrics(); 
LayoutParams params = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); 
params.setMargins(0, metrics.heightPixels - 20, 0, 0); 
View v = new View(context); 
v.setLayoutParams(params); 
frameLayout.addView(v); 

Esto colocará el FrameLayout 20 píxeles en la parte inferior de la pantalla.

Editar: completó el ejemplo por lo que se sostiene por sí mismo. Y oh, sí, funciona.

+0

1) ¿qué es el ancho? ¿De dónde viene? 2) metric.width no existe, es metric.widthPixels. 3) Esto no funciona, y si lo hiciera, todavía no lo haría porque no agregas v en cualquier lugar ... – glace

Cuestiones relacionadas