¿Cómo mostrar un diseño encima del otro programáticamente en mi caso?


Mi diseño principal principal.xml simplemente contiene dos LinearLayouts:

  • El 1er LinearLayout hosts a VideoView y a Button,
  • El 2do LinearLayout alberga un EditText, y este LinearLayout ha establecido el valor visibilidad a " IDO" (android:visibility="gone")

Como abajo:

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

Implementé con éxito la característica que cuando se presiona Button (con id my_btn), el 2do LinearLayout con EditText se muestra el campo, con la siguiente Java código:

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 el código Java anterior, el 2do LinearLayout con EditText se muestra como anexando a continuación el 1 LinearLayout lo cual tiene sentido.

PERO , Lo que necesito es: cuando Button (id: my_btn) se presiona, el 2do LinearLayout con EditText se muestra en la parte superior de el 1st LinearLayout, que se parece al 2do LinearLayout con EditText se eleva desde la parte inferior de la pantalla, y el 2do LinearLayout con EditText solo ocupar parte de la pantalla desde la parte inferior, que es el 1st LinearLayout todavía visible, como la imagen de abajo mostró:

introduzca la descripción de la imagen aquí

Entonces, cuando se presiona Button(id: my_btn) cómo mostrar el 2do LinearLayout con EditText en la parte superior de el 1 LinearLayout en lugar de agregar 2nd LinearLayout abajo LinearLayout ¿programáticamente?

Author: Mellon, 2011-07-14

3 answers

Utilice un FrameLayout con dos hijos. Los dos niños se superponen. Esto se recomienda en uno de los tutoriales de Android en realidad, no es un truco...

Aquí hay un ejemplo donde se muestra un TextView encima de 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>

Aquí está el resultado

 180
Author: Alexandru Cristescu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-01-10 15:57:43

La respuesta, dada por Alexandru, está funcionando bastante bien. Como dijo, es importante que esta vista "accessor"se agregue como último elemento. Aquí hay un código que hizo el truco para mí:

        ...

        ...

            </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
Author: Martin Pfeffer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-04-15 19:12:57

FrameLayout no es la mejor manera de hacer esto:

Use RelativeLayout en su lugar. Puede colocar los elementos en cualquier lugar que desee. El elemento que viene después, tiene el índice z más alto que el anterior (es decir, viene sobre el anterior).

Ejemplo:

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

introduzca la descripción de la imagen aquí

 0
Author: Raj Yadav,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-03-05 07:56:00