gpt4 book ai didi

android - 获得插图的正确方法

转载 作者:行者123 更新时间:2023-12-04 23:59:56 25 4
gpt4 key购买 nike

我在数据绑定(bind)布局中有一个 Activity 和一个 RecyclerView。 RecyclerView 占据了整个屏幕,并着眼于让 UX 变成全屏,在状态栏和导航栏下绘制。

我在 Activity 的 onCreate 中调用 setSystemUiVisibility,如下所示。

window.decorView.setSystemUiVisibility(
View.SYSTEM_UI_FLAG_LAYOUT_STABLE
or View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
)

现在 RecyclerView 绘制在系统栏下方,所以我想确保它有足够的填充,这样项目就不会与系统 UI 重叠。

我找到了 2 种方法,通过 BindingAdapter

选项 1

    var  statusBar = 0
var resourceId = view.resources.getIdentifier("status_bar_height", "dimen", "android")
if (resourceId > 0) {
statusBar = view.resources.getDimensionPixelSize(resourceId)
}
var navBar = 0
resourceId = view.resources.getIdentifier("navigation_bar_height", "dimen", "android")
if (resourceId > 0) {
navBar = view.resources.getDimensionPixelSize(resourceId)
}
view.setPadding(0, statusBar, 0, navBar)

选项 2

var insets = view.rootWindowInsets.stableInsets
view.setPadding(0, insets.top, 0, insets.bottom)

我更喜欢第一个,因为它(似乎在模拟器上进行了有限测试)适用于 API 21、28 和 29。

选项 2 仅适用于 API 29,并且如果/当未附加 View 时,似乎在 view.rootWindowInsets 上也为空。 (所以我想我必须添加一个监听器并等待它在执行此操作之前附加)

所以我的问题是,选项 1 有缺点吗?我可以通过 29 中的新 API 使用它吗?是否存在选项 1 不起作用的情况?

(我认为选项 1 在导航栏和系统栏都位于底部的平板电脑上可能效果不佳,因此额外的填充将应用到错误的一侧。)

最佳答案

聚会有点晚了,但这是我一直在做的方式,有人可能需要它。

对于Android M及以上版本,可以直接调用View#rootWindowInsets,否则依赖Java的Reflection访问私有(private)字段mStableInsets

fun getStableInsets(view: View): Rect {
return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
val windowInsets = view.rootWindowInsets
if (windowInsets != null) {
Rect(windowInsets.stableInsetLeft, windowInsets.stableInsetTop,
windowInsets.stableInsetRight, windowInsets.stableInsetBottom)
} else {
// TODO: Edge case, you might want to return a default value here
Rect(defaultInsetLeft, defaultInsetTop, defaultInsetRight, defaultInsetBottom)
}
} else {
val attachInfoField = View::class.java.getDeclaredField("mAttachInfo")
attachInfoField.isAccessible = true
val attachInfo = attachInfoField.get(view);
if (attachInfo != null) {
val stableInsetsField = attachInfo.javaClass.getDeclaredField("mStableInsets")
stableInsetsField.isAccessible = true
Rect(stableInsetsField.get(attachInfo) as Rect)
} else {
// TODO: Edge case, you might want to return a default value here
Rect(defaultInsetLeft, defaultInsetTop, defaultInsetRight, defaultInsetBottom)
}
}
}

关于android - 获得插图的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60475355/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com