Ma mise en page principale main.xml contient simplement deux LinearLayouts:
LinearLayout
héberge un VideoView
et un Button
,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 EditText
est 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:
Ainsi, lorsque vous appuyez sur Button
(id: my_btn), comment afficher le 2ndLinearLayout
avec EditText
au-dessus de = le 1erLinearLayout
au lieu d'ajouter 2eLinearLayout
ci-dessous 1erLinearLayout
par programmation?
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>
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) {
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>