Come mostrare un layout sopra l'altro a livello di codice nel mio caso?


84

Il mio layout principale main.xml contiene semplicemente due LinearLayouts:

  • Il 1 ° LinearLayoutospita ae VideoViewaButton ,
  • Il secondo LinearLayoutospita un EditText, e questo LinearLayoutha impostato il valore di visibilità su " GONE " ( android:visibility="gone")

come sotto:

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

Ho implementato con successo la caratteristica che, quando il Button(con id my_btn) viene premuto, il 2 ° LinearLayout con EditTextcampo è mostrato, con il seguente codice Java:

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

    }
}); 

Con il codice Java sopra, il secondo LinearLayout con EditTextviene mostrato come aggiunto di seguito il primo LinearLayout che ha senso.

MA , ciò di cui ho bisogno è: quando Buttonsi preme (id: my_btn), il 2 ° LinearLayout con EditText viene mostrato sopra il 1 ° LinearLayout , che sembra che il 2 ° LinearLayout con EditTextsi alzi dalla parte inferiore dello schermo e il 2 ° LinearLayout conEditText occupa solo una parte del schermata dal basso, questo è il primo LinearLayout ancora visibile, come mostrato nell'immagine sottostante:

inserisci qui la descrizione dell'immagine

Quindi, quando Buttonsi preme (id: my_btn), come mostrare il 2 ° LinearLayout con EditText sopra il 1 ° LinearLayout invece di aggiungere il 2 ° LinearLayout sotto il 1 ° a livello di LinearLayout programmazione?

Risposte:


187

Usa un FrameLayout con due figli. I due bambini verranno sovrapposti. Questo è consigliato in uno dei tutorial di Android in realtà, non è un hack ...

Ecco un esempio in cui viene visualizzato un TextView sopra 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>

Ecco il risultato


14
In questo codice, cosa rende TextViewin cima? è perché è secondo nell'elenco?
Adam Johns

14
Come dicono i documenti di FrameLayout: le viste figlio vengono disegnate in una pila, con il figlio aggiunto più di recente in cima. Considerando che il layout xml viene analizzato dall'alto verso il basso, l'elemento TextView viene disegnato in alto come l'ultimo in xml.
Maciej Pigulski

Sto provando questo ma con Scrollview come primo figlio di FrameLayout e TextView come secondo figlio. Ma qui non mostra lo scrollview sullo sfondo. Qualsiasi aiuto.
Raju

1
Grazie Fratello! Questa risposta era esattamente quello che stavo cercando! Grande! @Raju: inserisci il seguente FrameLayout prima dell'ULTIMO tag di chiusura del layout (schermo intero) ... <FrameLayout android: id = "@ + id / icon_frame_container" android: layout_width = "match_parent" android: layout_height = "match_parent"> </FrameLayout> Ora fai riferimento ad esso e utilizza il metodo onClick o onTouch come al solito.
Martin Pfeffer

1
FrameLayout è la scelta giusta qui, ma vale anche la pena notare che RelativeLayout si comporterebbe allo stesso modo quando le visualizzazioni figlie si impilano l'una sull'altra mentre vengono aggiunte. (Ero nuovo su Android e pensavo erroneamente che solo FrameLayout potesse eseguire lo stacking dopo aver letto questa risposta. Whoopsie)
Luca

5

FrameLayout non è il modo migliore per farlo:

Uso RelativeLayout invece. Puoi posizionare gli elementi ovunque tu voglia. L'elemento che viene dopo, ha lo z-index più alto del precedente (cioè viene sopra il precedente).

Esempio:

<?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>

inserisci qui la descrizione dell'immagine


4

La risposta, data da Alexandru, funziona abbastanza bene. Come ha detto, è importante che questa vista "accessor" sia aggiunta come ultimo elemento. Ecco del codice che ha funzionato per me:

        ...

        ...

            </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>

in Java:

final MaterialDialog materialDialog = (MaterialDialog) dialogInterface;

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

frameLayout.setOnTouchListener(
        new OnSwipeTouchListener(ShowCardActivity.this) {
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.