80 votes

Android superpose une vue sur tout ?

Peut-on superposer une vue sur tout dans Android ?

Dans l'iPhone, j'obtiendrais que la nouvelle vue définisse son frame.origin à (0,0) et sa largeur et sa hauteur à la largeur et la hauteur de self.view . En l'ajoutant à self.view le ferait agir comme une superposition, couvrant le contenu derrière (ou, si l'arrière-plan est transparent, montrant la vue derrière).

Existe-t-il une technique similaire dans Android ? Je réalise que les vues sont légèrement différentes (il y a trois types (ou plus...) relativelayout, linearlayout et framelayout) mais y a-t-il un moyen de superposer une vue sur tout sans distinction ?

107voto

Knickedi Points 5881

Il suffit d'utiliser RelativeLayout ou FrameLayout . La dernière vue enfant se superpose à toutes les autres.

Android prend en charge un modèle que le SDK de Cocoa Touch ne prend pas en charge : La gestion de la mise en page.
Mise en page pour l'iPhone permet de positionner tout en absolu (à l'exception de certains facteurs d'extension). La mise en page dans Android signifie que les enfants seront placés les uns par rapport aux autres.

Exemple (le deuxième EditText couvrira complètement le premier) :

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

    <EditText
        android:layout_width="fill_parent"
        android:id="@+id/editText1"
        android:layout_height="fill_parent">
    </EditText>

    <EditText
        android:layout_width="fill_parent"
        android:id="@+id/editText2"
        android:layout_height="fill_parent">
        <requestFocus></requestFocus>
    </EditText>

</FrameLayout>

FrameLayout est une sorte de pile de vues. Fait pour les cas particuliers.

RelativeLayout est assez puissant. Vous pouvez définir des règles comme La vue A doit aligner la mise en page parent en bas , La vue B doit aligner A de bas en haut etc.

Mise à jour en fonction du commentaire

Habituellement, vous définissez le contenu avec setContentView(R.layout.your_layout) sur onCreate (cela gonflera la mise en page pour vous). Vous pouvez le faire manuellement et appeler setContentView(inflatedView) il n'y a pas de différence.

La vue elle-même peut être une vue unique (telle que TextView ) ou une hiérarchie complexe de mises en page (mises en page imbriquées, puisque toutes les mises en page sont elles-mêmes des vues).

Après avoir appelé setContentView votre activité sait à quoi ressemble son contenu et vous pouvez utiliser (FrameLayout) findViewById(R.id.root_view) pour récupérer n'importe quelle vue dans cette hiérarchie (modèle général). (ClassOfTheViewWithThisId) findViewById(R.id.declared_id_of_view) ).

20voto

Dilroop Singh Points 49
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/root_view"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >

<LinearLayout
    android:id = "@+id/Everything"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >
    <!-- other actual layout stuff here EVERYTHING HERE -->

   </LinearLayout>

<LinearLayout
    android:id="@+id/overlay"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="right" >
</LinearLayout>

Maintenant, toute vue que vous ajoutez sous LinearLayout avec android:id = "@+id/overlay" apparaîtra en superposition avec gravité = droite sur la mise en page linéaire avec android:id="@+id/Everything"

11voto

Ahmad Aghazadeh Points 8690

Vous pouvez utiliser bringToFront :

    View view=findViewById(R.id.btnStartGame);
    view.bringToFront();

9voto

Jacks Gong Points 471

Le meilleur moyen est ViewOverlay Depuis Android JellyBeanMR2 (Api 18), vous pouvez ajouter n'importe quel dessinable comme superposition à n'importe quelle vue.

Ajouter mMyDrawable à mMyView pour le recouvrir :

mMyDrawable.setBounds(0, 0, mMyView.getMeasuredWidth(), mMyView.getMeasuredHeight())
mMyView.getOverlay().add(mMyDrawable)

1voto

Je viens de trouver une solution à ce problème. J'ai fait un bibliothèque pour faire cela d'une manière réutilisable, c'est pourquoi vous n'avez pas besoin de recoder dans votre XML. Voici de la documentation sur la façon de l'utiliser dans Java et Kotlin . Tout d'abord, initialisez-le à partir d'une activité à partir de laquelle vous voulez montrer la superposition-

AppWaterMarkBuilder.doConfigure()
                .setAppCompatActivity(MainActivity.this)
                .setWatermarkProperty(R.layout.layout_water_mark)
                .showWatermarkAfterConfig();

Vous pouvez ensuite le masquer et l'afficher depuis n'importe où dans votre application.

  /* For hiding the watermark*/
  AppWaterMarkBuilder.hideWatermark() 

  /* For showing the watermark*/
  AppWaterMarkBuilder.showWatermark() 

Aperçu du Gif -

preview

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X