Wie kann ich in meinem Fall ein Layout programmgesteuert über dem anderen anzeigen?

84

Mein Hauptlayout main.xml enthält einfach zwei LinearLayouts:

  • Der 1. LinearLayoutGastgeber a VideoViewund a Button,
  • Der 2. LinearLayouthostet ein EditText, und dies LinearLayouthat den Sichtbarkeitswert auf " GONE " gesetzt ( android:visibility="gone")

Wie unten:

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

Ich implementierte erfolgreich das Merkmal , dass , wenn die Button(mit der ID my_btn) gedrückt wird, die zweite LinearLayout mit EditTextist Feld angezeigt, mit dem folgenden 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);

    }
}); 

Mit dem obigen Java-Code wird der 2. LinearLayout mit EditTextwie unter dem 1. angehängt angezeigt LinearLayout, was sinnvoll ist.

ABER , was ich brauche ist: Wenn Button(id: my_btn) gedrückt wird, wird das 2. LinearLayout mit EditText oben auf dem 1. angezeigtLinearLayout , was so aussieht, als ob das 2. LinearLayout mit EditTextvom unteren Bildschirmrand aufsteigt, und das 2. LinearLayout mit EditTextnur einen Teil des Bildschirm von unten, das ist das 1. LinearLayout, das noch sichtbar ist, wie das folgende Bild zeigt:

Geben Sie hier die Bildbeschreibung ein

Wenn also Button(id: my_btn) gedrückt wird, wie wird die 2. LinearLayout mit EditText über der 1. angezeigt, LinearLayoutanstatt die 2. programmgesteuert an die 1.LinearLayout unter der 1. LinearLayout anzuhängen?

Mellon
quelle

Antworten:

186

Verwenden Sie ein FrameLayout mit zwei Kindern. Die beiden Kinder werden sich überschneiden. Dies wird in einem der Tutorials von Android empfohlen, es ist kein Hack ...

Hier ist ein Beispiel, in dem eine Textansicht über einer Bildansicht angezeigt wird:

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

Hier ist das Ergebnis

Alexandru Cristescu
quelle
13
Was macht in diesem Code das TextViewoben? liegt es daran, dass es in der Auflistung an zweiter Stelle steht?
Adam Johns
13
In den FrameLayout-Dokumenten heißt es: Untergeordnete Ansichten werden in einem Stapel gezeichnet, wobei das zuletzt hinzugefügte untergeordnete Element oben steht. Wenn Sie berücksichtigen, dass das XML-Layout von oben nach unten analysiert wird, wird das TextView-Element als letztes Element in der XML-Datei oben gezeichnet.
Maciej Pigulski
Ich versuche dies, aber mit Scrollview als erstem Kind von FrameLayout und TextView als zweitem Kind. Aber hier wird die Bildlaufansicht im Hintergrund nicht angezeigt. Irgendeine Hilfe.
Raju
1
Danke Bruder! Diese Antwort war genau das, wonach ich suche! Toll! @Raju: Platziere das folgende FrameLayout vor dem LETZTEN schließenden Tag deines Layouts (ganzer Bildschirm) ... <FrameLayout android: id = "@ + id / icon_frame_container" android: layout_width = "match_parent" android: layout_height = "match_parent"> </ FrameLayout> Verweisen Sie nun darauf und führen Sie wie gewohnt Ihre onClick- oder onTouch-Methode aus.
Martin Pfeffer
1
FrameLayout ist hier die richtige Wahl, aber es ist auch erwähnenswert, dass sich RelativeLayout genauso verhält, wenn untergeordnete Ansichten beim Hinzufügen übereinander gestapelt werden. (Ich war neu in Android und dachte fälschlicherweise, dass nur FrameLayout nach dem Lesen dieser Antwort das Stapeln erreichen könnte. Whoopsie)
Luke
4

Die Antwort von Alexandru funktioniert ganz gut. Wie er sagte, ist es wichtig, dass diese "Accessor" -Ansicht als letztes Element hinzugefügt wird. Hier ist ein Code, der den Trick für mich getan hat:

        ...

        ...

            </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) {
Martin Pfeffer
quelle
4

FrameLayout ist nicht der bessere Weg, dies zu tun:

Verwenden Sie RelativeLayoutstattdessen. Sie können die Elemente beliebig positionieren. Das nachfolgende Element hat den höheren Z-Index als das vorherige (dh es kommt über das vorherige).

Beispiel:

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

Geben Sie hier die Bildbeschreibung ein

Raj Yadav
quelle