如何在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 (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...