如何解决如何在Android上恢复自定义视图的translationX
我有一个派生自 LinearLayout
的自定义选项卡视图,它会扩展 xml 布局。
在其中,我有一个用作指示条的视图 (llIndicator
),我通过为视图的 translationX
属性设置动画来实现这一点:
val offset = llIndicator.width * activeTabIndex
llIndicator.animate().translationX(offset.toFloat())
一切正常,唯一的问题是当我试图在活动被销毁并重新创建后恢复视图的状态时。大多数属性甚至不需要保存,因为再次调用片段中的设置代码,但我想保存选定的选项卡并恢复translationX 属性并在没有动画的情况下恢复它。
但我似乎无法找到正确的解决方案。我将选定的选项卡保存到一个包中,成功恢复它,计算出正确的位置,但是当我设置 translationX
属性时,它没有做任何事情...
如果我在 onRestoreInstanceState()
方法中执行它不起作用,因为它发生在布局之前,所以我尝试在 isinstanceBeingRestored
中将 true
变量设置为 onRestoreInstanceState()
} 并在 translationX
方法中设置 onLayout()
,但没有成功。
所以我也尝试使用 OnGlobalLayoutListner()
,将以下代码放在视图的 init{ }
中。
viewTreeObserver.addOnGlobalLayoutListener(object: ViewTreeObserver.OnGlobalLayoutListener{
override fun onGlobalLayout() {
viewTreeObserver.removeOnGlobalLayoutListener(this)
// Restore view if needed
if(isinstanceBeingRestored){
llIndicator.translationX = offset
}
}
})
它仍然没有任何作用... offset
计算正确,我使用 Log.d()
检查,并且用任何数字替换它也无效。
所以我尝试使用 post() 方法,如下所示:
llIndicator.post({
llIndicator.translationX = offset
})
我尝试将它放在 onLayout()
方法中(当然首先检查 isinstanceBeingRestored
变量)和 OnGlobalLayoutListener()
但没有效果。
但有趣的是,如果我使用具有足够大延迟的 postDelayed(),它就可以工作。
llIndicator.postDelayed({
llIndicator.translationX = offset
},1500)
但显然,这个解决方案不能保留,我只是尝试了一下...... 所以我很困惑......这听起来很容易解决,但经过数小时的谷歌搜索和尝试不同的代码,并抓挠我的头,我仍然无法解决它。肯定不会这么难吧?
我做错了什么?有人能指出我正确的方向吗?
非常感谢您的帮助。
编辑:
我发现了一些有趣的东西...
如果我使用 marginStart
而不是 translationX
如下设置它的工作位置。那是什么原因呢?我不明白...
override fun onLayout(changed: Boolean,l: Int,t: Int,r: Int,b: Int) {
if(isinstanceBeingRestored){
val p = llIndicator.layoutParams as MarginLayoutParams
p.marginStart = offset.toInt()
llIndicator.layoutParams = p
//llIndicator.translationX = offset
}
}
编辑 2:
那么它只适用于 marginStart
如果在活动被破坏之前保证金开始为 0...所以如果我将 offset
设置为一个随机值,独立于其先前的位置,它会在正确的位置显示指示器位置,如果 marginStart
之前为 0...
否则,指示条会出现在屏幕左侧。
现在我真的迷路了......
我仔细检查了计算,但他们给出了正确的偏移量...
最好的祝福, 阿戈斯顿
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。