web-dev-qa-db-fra.com

Android superposer une vue par-dessus tout?)

Pouvez-vous superposer une vue au-dessus de tout dans Android?

Dans l'iPhone, la nouvelle vue définissait sa valeur frame.Origin Sur (0,0) et ses largeur et hauteur sur la largeur et la hauteur de self.view. En l'ajoutant à self.view, Il agirait alors comme une superposition, couvrant le contenu derrière (ou s'il avait un arrière-plan transparent, affichant ensuite la vue derrière).

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

69
Thomas Clayson

Utilisez simplement RelativeLayout ou FrameLayout. La dernière vue enfant superposera tout le reste.

Android prend en charge un modèle que Cocoa Touch SDK n’a pas: Gestion de la présentation.
Layout pour iPhone signifie positionner tout ce qui est absolu (à part certains facteurs d'étirement). Layout in Android signifie que les enfants seront placés les uns par rapport aux autres).

Exemple (le second 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 des cas spéciaux.

RelativeLayout est assez puissant. Vous pouvez définir des règles telles que La vue A doit aligner le bas de la présentation parent , La vue B doit aligner A de bas en haut , etc.

Mise à jour basée sur le commentaire

Habituellement, vous définissez le contenu avec setContentView(R.layout.your_layout) dans 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 de modèles complexe (modèles imbriqués, car tous les modèles sont eux-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)).

95
Knickedi
<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 comme superposition avec gravité = droite sur la présentation linéaire avec Android:id="@+id/Everything"

15
Dilroop Singh

Vous pouvez utiliser bringToFront:

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

La meilleure façon de procéder est de ViewOverlay , Vous pouvez ajouter n'importe quel dessin en tant que superposition à une vue en tant que superposition depuis Android JellyBeanMR2 (Api 18).

Ajoutez mMyDrawable à mMyView en tant que superposition:

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

J'ai essayé les auvents avant mais cela n'a pas fonctionné. Maintenant, j’ai utilisé un LinearLayout au lieu d’un TextureView, cela fonctionne maintenant sans problème. J'espère que cela aidera d'autres personnes qui ont le même problème. :)

    view = (LinearLayout) findViewById(R.id.view); //this is initialized in the constructor
    openWindowOnButtonClick();

public void openWindowOnButtonClick()
{
    view.setAlpha((float)0.5);
    FloatingActionButton fb = (FloatingActionButton) findViewById(R.id.floatingActionButton);
    final InputMethodManager keyboard = (InputMethodManager) getSystemService(getBaseContext().INPUT_METHOD_SERVICE);
    fb.setOnClickListener(new View.OnClickListener()
    {
        @Override
        public void onClick(View v)
        {
            // check if the Overlay should be visible. If this value is false, it is not shown -> show it.
            if(view.getVisibility() == View.INVISIBLE)
            {
                view.setVisibility(View.VISIBLE);
                keyboard.toggleSoftInput(InputMethodManager.SHOW_IMPLICIT, 0);
                Log.d("Overlay", "Klick");
            }
            else if(view.getVisibility() == View.VISIBLE)
            {
                view.setVisibility(View.INVISIBLE);
                keyboard.toggleSoftInput(0, InputMethodManager.HIDE_IMPLICIT_ONLY);
            }
0
HaxnHarald