web-dev-qa-db-fra.com

Comment afficher une mise en page l'une sur l'autre par programme dans mon cas?

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

  • Le premier LinearLayout héberge un VideoView et un Button,
  • Le 2nd LinearLayout héberge un EditText, et ce LinearLayout a défini la valeur de visibilité sur " A DISPARU "(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é qui indique que lorsque le bouton Button (avec id my_btn) est activé, le champ 2ndLinearLayout avec EditText est en suivant Java code:

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 2ndLinearLayout avec EditText est affiché comme en ajoutant ci-dessous le 1erLinearLayout ce qui a du sens.

MAIS , ce dont j'ai besoin, c'est: lorsque Button (id: my_btn) est enfoncé, le 2ndLinearLayout avec EditTextest affiché en haut de le 1erLinearLayout, qui ressemble au 2nd = LinearLayout avec EditText monte du bas de l'écran et les 2ndLinearLayout avec EditText n'occupent qu'une partie de la l'écran du bas, c'est le premier LinearLayout encore visible, comme le montre l'image ci-dessous:

enter image description here

Ainsi, lorsque vous appuyez sur Button (id: my_btn), comment afficher le 2ndLinearLayout avec EditTextau-dessus de = le 1erLinearLayout au lieu d'ajouter 2eLinearLayout ci-dessous 1erLinearLayout par programmation?

84
Mellon

Utilisez un FrameLayout avec deux enfants. Les deux enfants se chevaucheront. Ceci est recommandé dans l'un des tutoriels de 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>

Here is the result

185
Alexandru Cristescu

La réponse donnée par Alexandru fonctionne assez bien. Comme il l'a dit, il est important que cette vue "accesseur" soit ajoutée au dernier élément. Voici un code qui a fait le tour 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) {
4
Martin Pfeffer

FrameLayout n'est pas la meilleure façon de faire ceci:

Utilisez RelativeLayout à la place. Vous pouvez positionner les éléments où vous voulez. L’élément qui vient après a le plus haut indice z que le précédent (c’est-à-dire qu’il vient au-dessus du 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>

enter image description here

4
Raj Yadav