<include> учитывает различные уровни API, такие как /layout-v19/layout.xml vs /layout/layout.xml? - PullRequest
0 голосов
/ 30 января 2019

У меня есть макет, где только одна его часть зависит от уровня API (он использует векторы), и мне нужно обрабатывать его по-разному для API-19.Я изменил макет, чтобы обрабатывать те, которые используют app:srcCompat:"@drawable/left_arrow_vector", который работает, чтобы 19 не вызывал сбой, но когда я тестирую его на других уровнях API, он все равно показывает тот же макет, что и Api-19 (Существует проблема с размером, которая облегчаетсм. Я исправлю это, когда выясню эту часть).

res / layout-v19:

<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@id/calTitleBar"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_alignParentStart="true"
    android:layout_alignParentTop="true"
    android:orientation="horizontal">

    <ImageView
        android:id="@id/prevMonth"
        app:srcCompat="@drawable/left_arrow_vector"
        android:contentDescription="@string/prev_month"
        android:layout_height="24dp"
        android:layout_width="24dp" />

    <TextView
        android:id="@id/calMonth"
        style="@style/CalendarTitle"
        android:layout_toStartOf="@id/nextMonth"
        android:layout_toEndOf="@id/prevMonth"
        tools:text="JANUARY 2019" />

    <ImageView
        android:id="@id/nextMonth"
        android:layout_alignParentRight="true"
        app:srcCompat="@drawable/right_arrow_vector"
        android:contentDescription="@string/next_month"
        android:layout_height="24dp"
        android:layout_width="24dp" />

</RelativeLayout>

res / layout:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@id/calTitleBar"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_alignParentStart="true"
    android:layout_alignParentTop="true"
    android:orientation="horizontal">

    <ImageButton
        android:id="@id/prevMonth"
        style="@style/CalendarLeftArrowButton"
        android:contentDescription="@string/prev_month" />

    <TextView
        android:id="@id/calMonth"
        style="@style/CalendarTitle"
        android:layout_toStartOf="@id/nextMonth"
        android:layout_toEndOf="@id/prevMonth"
        tools:text="JANUARY 2019" />

    <ImageButton
        android:id="@id/nextMonth"
        style="@style/CalendarRightArrowButton"
        android:contentDescription="@string/next_month" />
</RelativeLayout>

соответствующая часть styles.xml:

    <style name="CalendarArrowButtons">
        <item name="android:layout_width">44dp</item>
        <item name="android:layout_height">44dp</item>
    </style>

    <style name="CalendarLeftArrowButton" parent="CalendarArrowButtons">
        <item name="android:layout_alignParentLeft">true</item>
        <item name="android:background">@drawable/left_arrow_vector</item>
    </style>

    <style name="CalendarRightArrowButton" parent="CalendarArrowButtons">
        <item name="android:layout_alignParentRight">true</item>
        <item name="android:background">@drawable/right_arrow_vector</item>
    </style>

Когда я удаляю include и просто использую либо напрямую, он отображается правильно (ну, нормальный макет падает на 19, но это следовало ожидать) в соответствующих версиях.

1 Ответ

0 голосов
/ 30 января 2019

Соответствует ли <include> различным уровням API, таким как /layout-v19/layout.xml vs /layout/layout.xml?

Да, тег обрабатывается во время выполнения с помощью LayoutInflater, и ссылочные макетызагружается как любые другие макеты в ваших ресурсах.

Я считаю, что проблема в том, что:

  • layout-v19 применяется к уровню API 19 и выше , если толькоесть более конкретные совпадения ресурсов
  • layout наименее конкретен, поэтому он применим только для уровней API ниже 19 для вас

Так что если вы хотите другой макет для API 20 и выше, положи в layout-v20.

...