¿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 aVideoView
y aButton
, - El 2do
LinearLayout
alberga unEditText
, y esteLinearLayout
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ó:
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 1ª LinearLayout
¿programáticamente?
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>
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) {
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>
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