作者 / 技术撰稿人兼软件工程师 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
-
已为与
Activity
或ActivityStack
类相关的操作添加类。 -
包括使用
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()
- 移除了以下 API,并将其功能替换为 RuleController API:
- ActivityEmbeddingController
-
已弃用
isSplitSupported()
方法并替换为splitSupportStatus
属性,以提供不可使用拆分功能的更多详细信息。 -
getInstance()
方法现已拥有Context
参数。
请注意 : ActivityEmbeddingController
和 RuleController
的 getInstance()
方法也有 Context
参数。
-
已添加以下
SplitAttributes
计算器功能,以便自定义拆分布局:setSplitAttributesCalculator()
clearSplitAttributesCalculator()
isSplitAttributesCalculatorSupported()
,用于检查此设备是否支持SplitAttributesCalculator
API。
-
已定义
SplitSupportStatus
嵌套类,从而为splitSupportStatus
属性提供状态常量。使您能够根据当前应用环境中是否支持 Activity 嵌入拆分来修改应用行为。
SplitRule
-
已添加可定义拆分默认布局的
defaultSplitAttributes
属性;取代splitRatio
和layoutDirection
。 -
已添加 XML 属性
splitRatio
和splitLayoutDirection
向defaultSplitAttributes
的转换。 -
已更改最小尺寸定义,使用密度无关像素 (dp) 而不是一般像素。
-
已将
minWidth
更改为默认值为 600dp 的minWidthDp
。 -
已将
minSmallestWidth
更改为默认值为 600dp 的minSmallestWidthDp
。 -
已添加默认值为 600dp 的
minHeightDp
属性。
-
-
已添加默认值为
ALWAYS_ALLOW
的maxAspectRatioInHorizontal
。 -
已添加默认值为 1.4 的
maxAspectRatioInPortrait
。 -
已定义用于替换完成行为常量的
FinishBehavior
嵌套类。 -
对
SplitPairRule
和SplitPlaceholderRule
的Builder
嵌套类进行了属性更改。
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
-
minWidthDp
和minSmallestWidthDp
现在可以使用 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() )
-
setFinishPrimaryWithSecondary
和setFinishSecondaryWithPrimary
采用类似FinishBehavior
枚举的常量。
有关详细信息,您可以参阅 SplitRule
迁移。
- 使用:
setMaxAspectRatioInPortrait( EmbeddingAspectRatio.ALWAYS_ALLOW )
在纵向显示的设备上显示拆分。
SplitPlaceholder.Builder
-
仅有
filters
和placeholderIntent
参数;其他属性移动至 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 创作顺利!也欢迎您持续关注我们,及时了解更多开发技术和产品更新等资讯动态。
版权声明
禁止一切形式的转载-禁止商用-禁止衍生 申请授权