Як програмно показати один макет поверх іншого в моєму випадку?


84

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

  • 1-й LinearLayoutведучий a VideoViewі a Button,
  • Другий LinearLayoutхост EditText, і це LinearLayoutвстановило значення видимості на " GONE " ( 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) відображається поле 2 LinearLayout з 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 коду, то другий LinearLayout з EditTextпоказано , як додавання нижче на 1 LinearLayout , який має сенс.

АЛЕ , що мені потрібно: коли Button(ID: my_btn) натиснута, другий LinearLayout з EditText показаний у верхній частині на 1 - й LinearLayout , який виглядає як 2 LinearLayout з EditTextпіднімається з нижньої частини екрану, і 2 LinearLayout з EditTextзаймають лише частину з екрану знизу, це перший LinearLayout все ще видно, як показано на малюнку нижче:

введіть тут опис зображення

Так що , коли Button(ID: my_btn) натиснута , як показати 2 - й LinearLayout з EditText у верхній частині на 1 LinearLayout замість додавання 2 - го LinearLayout нижче 1 - го LinearLayout програмно?

Відповіді:


187

Використовуйте 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>

Ось результат


13
Що в цьому коді робить TextViewверх? це тому, що він займає друге місце в списку?
Адам Джонс,

13
Як сказано в документах FrameLayout: Дочірні подання малюються у стосі, а зверху додано останню дочірню дитину. Враховуючи, що макет xml аналізується зверху вниз, тоді елемент TextView малюється зверху як останній у xml.
Maciej Pigulski

Я намагаюся це, але зі Scrollview як 1-а дочірня FrameLayout та TextView як 2-а дочірня. Але тут він не відображає прокручування у фоновому режимі. Будь-яка допомога.
Раджу

1
Спасибі, брат! Ця відповідь була саме такою, яку я шукаю! Чудово! @Raju: Розмістіть наступний FrameLayout перед ОСТАННІМ тегом закриття вашого макета (весь екран) ... <FrameLayout android: id = "@ + id / icon_frame_container" android: layout_width = "match_parent" android: layout_height = "match_parent"> </FrameLayout> Тепер посилайтеся на нього та виконуйте свій метод onClick- або onTouch, як зазвичай.
Мартін Пфеффер,

1
Тут є правильний вибір FrameLayout, але також варто зазначити, що RelativeLayout поводиться так само, коли дочірні подання складаються один на одного, коли вони додаються. (Я був новим в Android і помилково думав, що лише FrameLayout може виконати стекинг після прочитання цієї відповіді. Упс)
Лука,

5

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>

введіть тут опис зображення


4

Відповідь, яку дав Александру, працює досить приємно. Як він сказав, важливо, щоб цей "accessor" -view був доданий як останній елемент. Ось деякий код, який зробив для мене фокус:

        ...

        ...

            </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) {
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.