<include> 是不是尊重不同的 api 级别,例如 /layout-v19/layout.xml vs /layout/layout.xml?

Posted

技术标签:

【中文标题】<include> 是不是尊重不同的 api 级别,例如 /layout-v19/layout.xml vs /layout/layout.xml?【英文标题】:Does <include> respect different api levels such as /layout-v19/layout.xml vs /layout/layout.xml?<include> 是否尊重不同的 api 级别,例如 /layout-v19/layout.xml vs /layout/layout.xml? 【发布时间】:2019-06-24 04:02:28 【问题描述】:

我有一个布局,其中只有一部分依赖于 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_
    android:layout_
    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_
        android:layout_ />

    <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_
        android:layout_ />

</RelativeLayout>

分辨率/布局:

<?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_
    android:layout_
    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>

当我删除包含并直接使用其中一个时,它会在各个版本上正确显示(好吧,正常布局在 19 上崩溃,但这是意料之中的)。

【问题讨论】:

【参考方案1】:

&lt;include&gt; 是否尊重不同的 api 级别,例如 /layout-v19/layout.xml/layout/layout.xml

是的,LayoutInflater 在运行时处理标记,并且引用的布局会像资源中的任何其他布局一样加载。

我认为问题在于:

layout-v19 应用于 API 级别 19及以上,除非有更具体的资源匹配 layout 是最不具体的,因此它仅适用于您低于 19 的 API 级别

因此,如果您想要 API 20 及更高版本的其他布局,请将其放入 layout-v20

【讨论】:

其中一个瞬间。 我误读/误解了关于“及以上”的部分。因此,特异性会将/layout 放在底部,而minSdk=19 基本上是没用的。用layout-v19layout-v20 尝试了你的答案,并且效果很好。如果有一种方法可以告诉 Android 仅“将此布局用于此 API”,并且如果没有被覆盖,则将 /layouts 设为默认值,那就太好了。谢谢。

以上是关于<include> 是不是尊重不同的 api 级别,例如 /layout-v19/layout.xml vs /layout/layout.xml?的主要内容,如果未能解决你的问题,请参考以下文章

HTML Anchor 标记是不是应该尊重 Disabled 属性?

c mktime 在 Windows 和 GNU/Linux 上是不是不同?

WPF 数据网格格式 - 并非所有样式都受到尊重

状态栏不尊重“barStyle”属性

为啥 IE 不尊重具有流体图像子项的表格宽度

Img 不尊重 html 中的宽度(使用 flexbox)