如何在Android上恢复自定义视图的translationX

如何解决如何在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.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?