it-swarm.com.ru

Как показать один макет поверх другого программно в моем случае?

Мой основной макет main.xml просто содержит два LinearLayouts:

  • Первый LinearLayout содержит VideoView и Button,
  • Второе LinearLayout содержит EditText, и это LinearLayout установило значение visibility равным "ПОШЕЛ" (Android:visibility="gone")

как ниже:

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

Я успешно реализовал функцию, состоящую в том, что при нажатии Button (с идентификатором my_btn) отображается поле 2ndLinearLayout с EditText со следующим кодом 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);

    }
}); 

С указанным выше кодом Java, 2ndLinearLayout с EditText показывается как добавляется ниже1stLinearLayout, что имеет смысл.

НО, мне нужно следующее: когда Button (id: my_btn) нажата, 2ndLinearLayout с EditTextотображается сверху1stLinearLayout, который выглядит как 2ndLinearLayout с EditText поднимается из нижней части экрана, а 2ndLinearLayout с EditText занимают только часть экрана снизу, это 1-й LinearLayout все еще виден, как показано на рисунке ниже:

enter image description here

Итак, когда Button (id: my_btn) нажата, как показать 2ndLinearLayout с EditTextповерх1stLinearLayout вместо добавления - 2-еLinearLayout ниже 1-еLinearLayout программно?

83
Mellon

Используйте FrameLayout с двумя детьми. Двое детей будут перекрываться. Это рекомендуется в одном из учебников от Android на самом деле, это не хак ...

Вот пример, где TextView отображается поверх 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>

Here is the result

183
Alexandru Cristescu

Ответ, данный Александру, работает довольно приятно. По его словам, важно, чтобы это "аксессорное" представление было добавлено как последний элемент. Вот код, который помог мне:

        ...

        ...

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

в Java:

final MaterialDialog materialDialog = (MaterialDialog) dialogInterface;

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

frameLayout.setOnTouchListener(
        new OnSwipeTouchListener(ShowCardActivity.this) {
4
Martin Pfeffer

FrameLayout не лучший способ сделать это:

Вместо этого используйте RelativeLayout. Вы можете расположить элементы где угодно. Элемент, который следует после, имеет более высокий z-индекс, чем предыдущий (то есть он превосходит предыдущий).

Пример:

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

enter image description here

4
Raj Yadav