WindowManager 1.1.0-beta01 新功能详解

WindowManager 1.1.0-beta01 新功能详解

作者 / 技术撰稿人兼软件工程师 Jon Eckenrode

Jetpack WindowManager 库的 1.1.0-beta01 版本正继续有条不紊地推进 1.1.0 稳定版本的发布。Beta 版增加多个新特性和功能,欢迎您即刻进行测试、抢先体验!

我们需要您的反馈以优化 WindowManager 的功能,从而为您提供更好的体验。如果您已经在使用该库之前的版本,可以将 1.1.0-beta01 依赖项添加到您的应用,然后按照下面的迁移步骤操作。此外,我们期待了解您的想法!

Activity 嵌入

androidx.window.embeddin

借助 Activity 嵌入优化大屏设备上的多 Activity 应用。1.1.0-beta01 版本增强和重构了 API,以便在管理任务窗口拆分时提供更出色的通用性、功能和控制能力。我们从 1.0.0 的实验性 API 开始实践,最终将于 1.1.0 版中稳定实现上述功能。

概览

我们已添加清单设置,方便您通知系统您的应用已经实现了 Activity 嵌入。重构的 SplitController 能更专注于拆分属性;已将拆分规则 API 提取至 RuleController 并将 Activity 嵌入 API 提取至 ActivityEmbeddingController。已添加 SplitAttributes 类,来描述嵌入拆分。已添加 EmbeddingAspectRatio 类,以便为应用 Activity 嵌入规则设置最小比率。已将像素单位更改为显示无关像素 (dp)。已启用拆分布局自定义功能。为规则添加标签,帮助开发人员识别和管理特定规则。

新功能

PROPERTY_ACTIVITY_EMBEDDING_SPLITS_ENABLED

  • 已在应用清单中的 <application> 标签中添加了一个布尔值属性。

ActivityEmbeddingController

  • 已为与 ActivityActivityStack 类相关的操作添加类。

  • 包括使用 isActivityEmbedded() 替换 SplitController 中的 API。

RuleController

  • 已为与 EmbeddingRule 类和子类相关的操作添加类。

  • 包括以下 API 用于取代 SplitController 中的 API:

    • addRule() — 添加规则或者更新具有相同标签的规则。
    • removeRule() — 从已注册规则的集合中移除规则。
    • setRules() — 建立规则集合。
    • clearRules() — 移除所有已注册的规则。
    • parseRules() — 从 XML 规则定义中解析规则。

SplitAttributes

  • 已为定义拆分布局而添加类。

EmbeddingAspectRatio

  • 添加了一个类,来定义与显示屏宽高比相关、类似于枚举的行为常量。允许您根据父级窗口的宽高比指定何时启用拆分。

您可以参阅 SplitRule,了解使用这些常量的属性。

具体变化

EmbeddingRule

  • 已添加用于识别拆分规则的标签字段。

SplitController

  • 重构了以下模块的 API:

    • ActivityEmbeddingController
      • isActivityEmbedded() 移动至 ActivityEmbeddingController
    • RuleController
      • 移除了以下 API,并将其功能替换为 RuleController API:
        • clearRegisteredRules()
        • getSplitRules()
        • initialize()
        • registerRule()
        • unregisterRule()
  • 已弃用 isSplitSupported() 方法并替换为 splitSupportStatus 属性,以提供不可使用拆分功能的更多详细信息。

  • getInstance() 方法现已拥有 Context 参数。

请注意 : ActivityEmbeddingControllerRuleControllergetInstance() 方法也有 Context 参数。

  • 已添加以下 SplitAttributes 计算器功能,以便自定义拆分布局:

    • setSplitAttributesCalculator()
    • clearSplitAttributesCalculator()
    • isSplitAttributesCalculatorSupported(),用于检查此设备是否支持 SplitAttributesCalculator API。
  • 已定义 SplitSupportStatus 嵌套类,从而为 splitSupportStatus 属性提供状态常量。使您能够根据当前应用环境中是否支持 Activity 嵌入拆分来修改应用行为。

SplitRule

  • 已添加可定义拆分默认布局的 defaultSplitAttributes 属性;取代 splitRatiolayoutDirection

  • 已添加 XML 属性 splitRatiosplitLayoutDirectiondefaultSplitAttributes 的转换。

  • 已更改最小尺寸定义,使用密度无关像素 (dp) 而不是一般像素。

    • 已将 minWidth 更改为默认值为 600dp 的 minWidthDp

    • 已将 minSmallestWidth 更改为默认值为 600dp 的 minSmallestWidthDp

    • 已添加默认值为 600dp 的 minHeightDp 属性。

  • 已添加默认值为 ALWAYS_ALLOWmaxAspectRatioInHorizontal

  • 已添加默认值为 1.4 的 maxAspectRatioInPortrait

  • 已定义用于替换完成行为常量的 FinishBehavior 嵌套类。

  • SplitPairRuleSplitPlaceholderRuleBuilder 嵌套类进行了属性更改。

SplitInfo

  • getSplitRatio() 替换为 getSplitAttributes(),以便提供与拆分相关的额外信息。

窗口布局

androidx.window.layout

您可以使用窗口布局库确定应用显示窗口的特性。在 1.1.0-beta01 版本中,您可以在 Activity 之外的环境中工作。

具体变化

WindowInfoTracker

  • 已在实验性版本中添加了非 Activity 界面上下文支持。

WindowMetricsCalculator

  • 已添加非 Activity 界面上下文支持。

迁移步骤

下一步,升级您之前的 Alpha 版本。此外,欢迎您告诉我们怎样帮助您进一步优化升级流程。

PROPERTY_ACTIVITY_EMBEDDING_SPLITS_ENABLED

  • 如要在应用中启用 Activity 嵌入,您必须在应用清单中的 标签中添加以下属性:
    < property android:name="android.window.PROPERTY_ACTIVITY_EMBEDDING_SPLITS_ENABLED" android:value="true" />

当该属性设置为 true 时,系统可以提前为应用优化拆分行为。

SplitInfo

  • 检查当前拆分是否堆叠:

SplitInfo.splitAttributes.splitType is SplitAttributes.SplitType.ExpandContainersSplitType

  • 查看当前比率:

if (SplitInfo.splitAttributes.splitType is SplitAttributes.SplitType.RatioSplitType) { val ratio = splitInfo.splitAttributes.splitType.ratio } else { // Ratio is meaningless for other types. }

SplitController

  • SplitController.getInstance() 更改为: SplitController.getInstance(Context)

  • SplitController.initialize(Context, @ResId int) 更改为: RuleController.getInstance(Context) .setRules(RuleController.parse(Context, @ResId int))

  • SplitController.getInstance().isActivityEmbedded(Activity) 更改为: ActivityEmbeddingController.getInstance(Context) .isActivityEmbedded(Activity)

  • SplitController.getInstance().registerRule(rule) 更改为: RuleController.getInstance(Context).addRule(rule)

  • SplitController.getInstance().unregisterRule(rule) 更改为: RuleController.getInstance(Context).removeRule(rule)

  • SplitController.getInstance().clearRegisteredRules() 更改为: RuleController.getInstance(Context).clearRules()

  • SplitController.getInstance().getSplitRules() 更改为: RuleController.getInstance(Context).getRules()

SplitRule

  • minWidth 更改为 minWidthDp,并将 minSmallestWidth 更改为 minSmallestWidthDp

  • minWidthDpminSmallestWidthDp 现在可以使用 dp 单位代替像素,应用可以使用以下调用: TypedValue.applyDimension( COMPLEX_UNIT_DIP, minWidthInPixels, resources.displayMetrics ) 或者您也可以直接按照 displayMetrics#density 来划分 minWithInPixels

SplitPairRule.Builder

  • SplitPairRule.Builder( filters, minWidth, minSmallestWidth ) 更改为: SplitPairRule.Builder(filters) // Optional if minWidthInDp argument is 600. .setMinWidthDp(minWidthInDp) // Optional if minSmallestWidthInDp argument is 600. .setMinSmallestWidthDp(minSmallestWidthInDp)

  • setLayoutDirection(layoutDirection) and setSplitRatio(ratio) 更改为: setDefaultSplitAttributes(SplitAttributes.Builder() .setLayoutDirection(layoutDirection) .setSplitType(SplitAttributes.SplitType.ratio(ratio)) .build() )

  • setFinishPrimaryWithSecondarysetFinishSecondaryWithPrimary 采用类似 FinishBehavior 枚举的常量。

有关详细信息,您可以参阅 SplitRule 迁移。

  • 使用: setMaxAspectRatioInPortrait( EmbeddingAspectRatio.ALWAYS_ALLOW ) 在纵向显示的设备上显示拆分。

SplitPlaceholder.Builder

  • 仅有 filtersplaceholderIntent 参数;其他属性移动至 setter。有关详细信息,您可以参阅 SplitPairRule.Builder

  • setFinishPrimaryWithPlaceholder 需要类似 FinishBehavior 枚举的常量。

有关详细信息,您可以参阅完成行为迁移。

  • setLayoutDirection(layoutDirection)setSplitRatio(ratio) 更改为 setDefaultSplitAttributes(SplitAttributes.Builder() .setLayoutDirection(layoutDirection) .setSplitType(SplitAttributes.SplitType.ratio(ratio)) .build() )

有关详细信息,您可以参阅布局方向迁移。

  • 使用: setMaxAspectRatioInPortrait( EmbeddingAspectRatio.ALWAYS_ALLOW ) 在纵向显示的设备上显示拆分。

完成行为

完成行为常量必须迁移至 FinishBehavior 类似枚举的类常量:

  • FINISH_NEVER 更改为 FinishBehavior.NEVER
  • FINISH_ALWAYS 更改为 FinishBehavior.ALWAYS
  • FINISH_ADJACENT 更改为 FinishBehavior.ADJACENT

布局方向

布局方向必须迁移至 SplitAttributes.LayoutDirection:

  • ltr 更改为 SplitAttributes.LayoutDirection.LEFT_TO_RIGHT
  • rtl 更改为 SplitAttributes.LayoutDirection.RIGHT_TO_LEFT
  • locale 更改为 SplitAttributes.LayoutDirection.LOCALE
  • splitRatio 迁移至 SplitAttributes.SplitType.ratio(splitRatio)

使用入门

如要开始使用 WindowManager,您可以将 Google Maven 代码库添加至您应用中的 settings.gradle 或项目级 build.gradle 文件中:

dependencyResolutionManagement {

    repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)


    repositories {

        google()

    }

}

然后将 1.1.0-beta01 依赖项添加到您应用中的模块级 build.gradle 文件中:

dependencies {

    implementation 'androidx.window:window:1.1.0-beta01'

    . . .

}

祝您使用 WindowManager 创作顺利!也欢迎您持续关注我们,及时了解更多开发技术和产品更新等资讯动态。

版权声明

禁止一切形式的转载-禁止商用-禁止衍生 申请授权

脉脉不得语
脉脉不得语
Zhengzhou Website
Android Developer | https://androiddevtools.cn and https://androidweekly.io Funder | GDG Zhengzhou Funder & Ex Organizer | http://Toast.show(∞) Podcast Host

你已经成功订阅到 Android 开发技术周报
太棒了!接下来,完成检验以获得全部访问权限 Android 开发技术周报
欢迎回来!你已经成功登录了。
Unable to sign you in. Please try again.
成功!您的帐户已完全激活,您现在可以访问所有内容。
Error! Stripe checkout failed.
Success! Your billing info is updated.
Error! Billing info update failed.
🍗