Создание стилизованного ListView над таким элементом, как iOS

Поиск нескольких столбцов с помощью dataframe:

frame[frame.filename.str.match('*.'+MetaData+'.*') & frame.file_path.str.match('C:\test\test.txt')]
0
задан Fantômas 15 January 2019 в 15:13
поделиться

1 ответ

При принятии решения о том, какой вид рисовать сверху, Android учитывает две вещи:

  • порядок, в котором виды отображаются в макете (следующий рисуется поверх предыдущего)
  • Z -координаты - вид с более высоким Z отображается над видом с более низким Z

Примечание! Старые устройства (ниже 21) не используют Z-порядок, только просмотр порядка. Новые устройства (21 и выше) сначала используют Z-порядок и (для представлений с одинаковыми Z-координатами) порядок просмотра.

Ваш макет может выглядеть следующим образом:

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout
    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"
    android:orientation="vertical"
    android:padding="20dp">

    <FrameLayout
        android:id="@+id/behindListViewWrapper"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <!-- here goes everything that should be behind listview, for example button -->

        <Button
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="A button behind"
            android:layout_gravity="center"
            android:background="#f00"/>

    </FrameLayout>

    <ListView
        android:id="@+id/listSearchViewDepart"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="#7000"
        android:divider="@null"
        android:dividerHeight="0dp"/>

    <android.support.v7.widget.SearchView
        android:id="@+id/searchDepart"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="#fff"
        app:defaultQueryHint="Arrêt de départ"
        app:iconifiedByDefault="false"
        app:queryHint="Arrêt de départ"/>

</FrameLayout>

Почему Button оборачивается дополнительным FrameLayout?
Поскольку виджеты могут иметь Z-координаты по умолчанию. Для кнопки Z равно 2 в нормальном состоянии и 8 в нажатом состоянии (см. https://material.io/design/environment/elevation.html ). Таким образом, во всех случаях кнопка будет нарисована сверху.
Но это можно обойти, обернув кнопку в другом макете.
При выборе того, что рисовать дальше, макет ищет только своих прямых потомков, а не всю иерархию. В этом случае все дочерние элементы имеют Z, равный 0, поэтому сначала рисует behindListViewWrapper, затем просмотр списка, затем просмотр поиска.

Если кнопка не была перенесена, она будет нарисована сверху (на современных устройствах из-за Z) или сзади (на старых устройствах из-за упорядочения вида).

0
ответ дан dhabensky 15 January 2019 в 15:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: