Pregunta

Quiero añadir una vista interior de un FrameLayout programación y colocarlo en un punto específico dentro del diseño con una anchura y una altura específica. ¿Apoya FrameLayout esto? Si no es así, ¿debería utilizar un ViewGroup intermedia para lograr esto?

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. Por desgracia, me acabo de enterar que AbsoluteLayout está en desuso.

Cualquier indicador será muy apreciada. Gracias.

¿Fue útil?

Solución

Es cierto que con FrameLayout todos los niños están vinculadas a la parte superior izquierda de la pantalla, pero todavía tiene cierto control con la configuración de su relleno. Si define diferentes valores de relleno a diferentes niños, van a aparecer en diferentes lugares de la FrameLayout.

Otros consejos

El siguiente ejemplo (código de trabajo) muestra cómo colocar una vista interior (EditarTexto) 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>

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 posicionará las FrameLayout 20 píxeles desde la parte inferior de la pantalla.

Editar completado el ejemplo lo que se destaca por sí mismo. Y, oh, sí lo hace el trabajo.

Desde el Quinn1000 proporciona:

  

Puede añadir varios hijos a una FrameLayout, pero todos los niños está vinculado a la parte superior izquierda de la pantalla.

Esto significa que no puede poner su vista en un punto específico dentro de la FrameLayout (a menos que usted quiere que sea en la esquina superior izquierda: -))

.

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

  

Un diseño que le permite especificar la ubicación exacta (coordenadas X / Y) de sus hijos. diseños absolutas son menos flexible y más difícil de mantener que otros tipos de diseños sin posicionamiento absoluto.

En cuanto a establecer el ancho y la altura de la vista, también como Quinn1000 dijo, que suministra el método v.setLayoutParams() un objeto LayoutParams , dependiendo del recipiente elegido (AbsoluteLayout, LinearLayout, etc.)

El hilo aquí en StackOverflow a

Cómo hacer que setLayoutParams () para un ImageView?

tapas un poco.

Por ejemplo: LinearLayout.LayoutParams LayoutParams = new LinearLayout.LayoutParams (30, 30); yourImageView.setLayoutParams (LayoutParams);

implica que tiene que ser la definición de una LinearLayout.LayoutParams (o en su caso un objeto FrameLayout.layoutParams) para pasar al método setLayoutParams de su v objeto.

A

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

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

generateDefaultLayoutParams () Con este método si no han definido los parámetros específicamente.

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

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