Comment afficher une mise en page au-dessus de l'autre par programmation dans mon cas?

84

Ma mise en page principale main.xml contient simplement deux LinearLayouts:

  • Le 1er LinearLayouthéberge un VideoViewet un Button,
  • Le 2ème LinearLayouthéberge un EditText, et cela LinearLayouta défini la valeur de visibilité sur " GONE " ( android:visibility="gone")

comme ci-dessous:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    
    android:layout_height="fill_parent" 
    android:layout_width="fill_parent"
        android:orientation="vertical"
>
    <LinearLayout 
        android:id="@+id/first_ll"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal"

    >
        <VideoView 
            android:id="@+id/my_video"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="9"
        />

        <Button
            android:id="@+id/my_btn"
            android:layout_width="30dip" 
            android:layout_height="30dip"
            android:layout_gravity="right|bottom"
                android:layout_weight="1"
        />

    </LinearLayout>

    <LinearLayout 
        android:id="@+id/second_ll"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:paddingTop="2dip"

        android:visibility="gone"
    >
        <EditText 
            android:id="@+id/edit_text_field"
            android:layout_height="40dip"
            android:layout_width="fill_parent"
            android:layout_weight="5"
            android:layout_gravity="center_vertical"
        />

    </LinearLayout>
</LinearLayout>

J'ai implémenté avec succès la fonctionnalité selon laquelle lorsque le Button(avec id my_btn) est enfoncé, le 2ème champ LinearLayoutavec EditTextest affiché, avec le code Java suivant:

LinearLayout secondLL = (LinearLayout) findViewById(R.id.second_ll);

Button myBtn = (Button) findViewById(R.id.my_btn);
myBtn.setOnClickListener(new OnClickListener(){
    @Override
    public void onClick(View v){
        int visibility = secondLL.getVisibility();

        if(visibility==View.GONE)
            secondLL.setVisibility(View.VISIBLE);

    }
}); 

Avec le code Java ci-dessus, le 2ème LinearLayout avec EditTextest affiché comme l' ajout en dessous du 1er LinearLayout ce qui a du sens.

MAIS , Ce que j'ai besoin est: quand Button(id: my_btn) est pressée, le 2ème LinearLayout avec EditText est montré au - dessus de la 1ère LinearLayout , qui ressemble à la 2ème LinearLayout avec EditTextest en hausse à partir du bas de l' écran, et la 2ème LinearLayout avec EditTextoccupent seulement une partie de la écran à partir du bas, c'est le 1er LinearLayout encore visible, comme l'image ci-dessous l'a montré:

entrez la description de l'image ici

Alors, quand Button(id: my_btn) est pressé comment afficher la 2ème LinearLayout avec EditText au - dessus de la 1ère LinearLayout place du annexant 2 LinearLayout ci - dessous le 1er LinearLayout programme?

Mellon
la source

Réponses:

186

Utilisez un FrameLayout avec deux enfants. Les deux enfants se chevaucheront. Ceci est recommandé dans l'un des tutoriels d'Android en fait, ce n'est pas un hack ...

Voici un exemple où un TextView est affiché au-dessus d'un ImageView:

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="fill_parent"
  android:layout_height="fill_parent">

  <ImageView  
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 

    android:scaleType="center"
    android:src="@drawable/golden_gate" />

  <TextView
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_marginBottom="20dip"
    android:layout_gravity="center_horizontal|bottom"

    android:padding="12dip"

    android:background="#AA000000"
    android:textColor="#ffffffff"

    android:text="Golden Gate" />

</FrameLayout>

Voici le résultat

Alexandru Cristescu
la source
13
Dans ce code, qu'est-ce qui fait TextViewle dessus? est-ce parce qu'il arrive deuxième dans la liste?
Adam Johns
13
Comme le dit la documentation FrameLayout: les vues enfants sont dessinées dans une pile, avec l'enfant le plus récemment ajouté en haut. Étant donné que la mise en page xml est analysée de haut en bas, l'élément TextView est dessiné en haut comme le dernier dans le xml.
Maciej Pigulski
J'essaye ceci mais avec Scrollview comme premier enfant de FrameLayout et TextView comme deuxième enfant. Mais ici, il ne montre pas le scrollview dans le backgroung. De l'aide.
Raju
1
Merci frère! Cette réponse était exactement ce que je cherchais! Génial! @Raju: Placez le FrameLayout suivant avant la DERNIÈRE balise de fermeture de votre mise en page (écran entier) ... <FrameLayout android: id = "@ + id / icon_frame_container" android: layout_width = "match_parent" android: layout_height = "match_parent"> </FrameLayout> Maintenant référencez-le et faites votre méthode onClick- ou onTouch comme d'habitude.
Martin Pfeffer
1
FrameLayout est le bon choix ici, mais il convient également de noter que RelativeLayout se comporterait de la même manière en ayant des vues enfants empilées les unes sur les autres au fur et à mesure qu'elles sont ajoutées. (J'étais nouveau sur Android et je pensais à tort que seul FrameLayout pouvait accomplir l'empilement après avoir lu cette réponse. Whoopsie)
Luc
4

La réponse, donnée par Alexandru fonctionne plutôt bien. Comme il l'a dit, il est important que cette vue "accesseur" soit ajoutée comme dernier élément. Voici un code qui a fait l'affaire pour moi:

        ...

        ...

            </LinearLayout>

        </LinearLayout>

    </FrameLayout>

</LinearLayout>

<!-- place a FrameLayout (match_parent) as the last child -->
<FrameLayout
    android:id="@+id/icon_frame_container"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
</FrameLayout>

</TabHost>

en Java:

final MaterialDialog materialDialog = (MaterialDialog) dialogInterface;

FrameLayout frameLayout = (FrameLayout) materialDialog
        .findViewById(R.id.icon_frame_container);

frameLayout.setOnTouchListener(
        new OnSwipeTouchListener(ShowCardActivity.this) {
Martin Pfeffer
la source
4

FrameLayout n'est pas la meilleure façon de procéder:

Utilisez RelativeLayoutplutôt. Vous pouvez positionner les éléments où vous le souhaitez. L'élément qui vient après, a le z-index plus élevé que le précédent (c'est-à-dire qu'il vient sur le précédent).

Exemple:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent" android:layout_height="match_parent">
    <ImageView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@color/colorPrimary"
        app:srcCompat="@drawable/ic_information"/>

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="This is a text."
        android:layout_centerHorizontal="true"
        android:layout_alignParentBottom="true"
        android:layout_margin="8dp"
        android:padding="5dp"
        android:textAppearance="?android:attr/textAppearanceLarge"
        android:background="#A000"
        android:textColor="@android:color/white"/>
</RelativeLayout>

entrez la description de l'image ici

Raj Yadav
la source