Question

Je veux ajouter une vue à l'intérieur d'un FrameLayout et programme pour le placer dans un point spécifique dans la mise en page avec une largeur spécifique et de la hauteur. Est-ce que ce FrameLayout soutien? Sinon, devrais-je utiliser un ViewGroup intermédiaire pour y parvenir?

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);

Mon idée initiale était d'ajouter un AbsoluteLayout au FrameLayout et placez la vue à l'intérieur du AbsoluteLayout. Malheureusement, je viens de découvrir que AbsoluteLayout est dépréciée.

Les pointeurs sera très appréciée. Merci.

Était-ce utile?

La solution

Il est vrai que tous les enfants avec FrameLayout sont chevillés en haut à gauche de l'écran, mais vous avez encore un certain contrôle avec la mise en leur rembourrage. Si vous définissez des valeurs différentes de remplissage aux différents enfants, ils apparaissent à différents endroits dans le FrameLayout.

Autres conseils

L'exemple suivant (code de travail) montre comment placer une vue (EditText) à l'intérieur d'un FrameLayout. il montre aussi comment définir la position du EditText à l'aide du poseur de setPadding du FrameLayout (à chaque fois à l'utilisateur clique sur le FrameLayout, la position du EditText est réglé sur la position du 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>

Vous pouvez également ajouter une marge autour de la vue de la position qu'il vient d'être ajouté à l'intérieur du 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);

Ceci va positionner les FrameLayout 20 pixels à partir du bas de l'écran.

Modifier complété l'exemple il se par lui-même. Et oh, oui, il fonctionne.

À partir du lien Quinn1000 fourni:

  

Vous pouvez ajouter plusieurs enfants à un FrameLayout, mais tous les enfants sont arrimé en haut à gauche de l'écran.

Cela signifie que vous ne pouvez pas mettre votre vue à un point spécifique à l'intérieur du FrameLayout (sauf que vous voulez qu'il soit dans le coin supérieur gauche: -))

.

Si vous avez besoin du positionnement absolu de la vue, essayez AbsoluteLayout :

  

Une mise en page qui vous permet de spécifier l'emplacement exact (x / y) de coordonnées de ses enfants. dispositions absolues sont moins souples et plus difficiles à entretenir que d'autres types de mises en page sans positionnement absolu.

En ce qui concerne le réglage de la largeur et la hauteur de la vue, comme l'a dit aussi Quinn1000, vous fournir la méthode v.setLayoutParams() un l'objet de LayoutParams, selon le conteneur que vous avez choisi (AbsoluteLayout, LinearLayout, etc.)

Le fil ici sur StackOverflow à

Comment avez-vous pour un ImageView setLayoutParams ()?

couvre un peu.

Par exemple: LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams (30, 30); yourImageView.setLayoutParams (layoutParams);

implique que vous devez être définir un LinearLayout.LayoutParams (ou dans votre cas un FrameLayout.layoutParams) objet de passer à la méthode setLayoutParams de votre objet v.

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

presque fait il semble que vous pourriez demander à votre v:

generateDefaultLayoutParams () via cette méthode si vous n'avez pas défini les paramètres spécifiquement.

Mais il est tard, et ces liens sont fait mes yeux saignent un peu. Faites-moi savoir si elles Nhelp tout: -)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top