Android 拥有自定义视图可确定其自身的可见性

Android 拥有自定义视图可确定其自身的可见性,android,android-custom-view,Android,Android Custom View,我想创建一个自定义的视图,该视图具有确定其自身可见性的显示逻辑。为了保持该逻辑的可包含性和可重用性,我创建了一个视图子类,覆盖getVisibility(),并计划在发生可能导致其可见性发生变化的事件时使视图失效。。。只能通过调用setVisibility()而不是重写getVisibility()来更改视图的可见性。看看罗曼盖伊对他的回答 在正常的视图生命周期/呈现过程中,是否有一个特定的方法会被调用,而在这个过程中,我会调用setVisibility()?因为我已经调用了invalidate

我想创建一个自定义的
视图
,该视图具有确定其自身可见性的显示逻辑。为了保持该逻辑的可包含性和可重用性,我创建了一个
视图
子类,覆盖
getVisibility()
,并计划在发生可能导致其可见性发生变化的事件时使
视图失效。。。只能通过调用
setVisibility()
而不是重写
getVisibility()
来更改
视图的可见性。看看罗曼盖伊对他的回答

在正常的
视图
生命周期/呈现过程中,是否有一个特定的方法会被调用,而在这个过程中,我会调用
setVisibility()
?因为我已经调用了
invalidate()
,所以重写它来调用
setVisibility()
是有效的。但那是理想的地方吗?在
invalidate()
中设置
视图的属性似乎有违最佳做法


澄清:安德尔指出,有许多事情可能会导致自定义
视图的可见性发生变化,这些场景对于自定义视图的使用非常具体。这是真的。但这个问题不是关于如何触发外观刷新-
invalidate()
似乎是告诉Android视图外观已更改的标准方式,不是吗?相反,这是一个最佳实践问题,即在自定义
视图失效后,在何处调用
setVisibility()
。我不想在流程的错误部分进行更改,例如在
onMeasure()
中。如果有人有链接,我希望看到Android的UI呈现过程的图表。

没有这样一个通用的方法,因为没有任何查看方法可以覆盖所有可能的情况,在这些情况下,它的可见性应该重新计算(只需考虑改变可见性的异步事件,例如网络操作状态的改变;甚至简单的计时器会关闭)

作为开发人员,您知道在哪些情况下可见性应该无效,并且您应该准确地在这些情况下修改可见性。当然,可以始终在每个布局和图形之前设置可见性,但是:

  • 我怀疑它不可能涵盖所有案件
  • 一两个月后理解可能会很奇怪
  • 这是一种过分的杀伤力——这是一种你正在使用的移动设备,你应该记住它的局限性,并以提高效率为目标
话虽如此,我真的不认为在设置可见性后调用
invalidate()
有什么意义-这是由平台自动完成的。我只建议:

private void invalidateVisibility() {
    // calculate visibility
    setVisibility(calculation_outcome);
    //invalidate();
}
并将调用更改为
invalidate()
invalidateviability()
。如果确实需要出于某种原因调用
invalidate()
,只需取消对调用的注释。这可能是最有效的解决方案

编辑:

我回答的要点是提出一些与您在撰写本文时所描述的逻辑(至少对我而言)一样一般的建议。我假设您在
invalidate()中正在进行一些关键的处理
method等等,你需要调用它。然而,你的问题困扰了我一段时间,在读了四五遍之后,我想我终于明白了你到底在问什么!:)

如果我理解正确,您已经在调用
invalidate()
,每次
视图的可见性可能发生变化时。因此,为了简单起见,您希望将视图可见性的修改合并到失效过程中

如果是这样的话,那么你是对的-在
invalidate()
中作为第一件事这样做完全可以。这就是为什么我在
invalidateVisibility()
中将调用完全按此顺序排列的原因:

  • 当一个
    视图
    变得可见时,它的父级会收到重新绘制的通知,然后调用
    invalidate()
    只需“与上一个视图分组”(这是因为所有挂起的绘制操作都是在一个批处理中处理的)
  • 视图变为不可见时,它会自动发出失效信号。对
    invalidate()
    的另一个调用将是不可操作的
然后是直觉——这是:

button.setVisible(false/true);
button.invalidate();
似乎不是可疑代码。实际上,这就是您的
invalidate()
将变成的内容。但是,请确认可见性的计算是一个快速操作,因为Android平台每秒可能会多次调用
invalidate()
。当用户界面设置动画时,通常会出现这种情况,例如,在按压手势期间更新视图的边界


希望这能有所帮助:)

我不是在setVisibility()之后调用invalidate()。我正在失效,并希望在视图的一个标准回调中设置可见性。我只是在找一个理想的。至于这个建议,invalidateviability()似乎是在无缘无故地重新发明轮子。依赖invalidate()并将其绑定到标准流程中不是更好吗?要求API客户机调用这种特定的一次性方法表明,他们对视图的显示逻辑有足够的了解,知道他们的操作具体影响了视图的可见性。有点违背目的。谢谢你的更新。对不起,如果我的问题一开始可能不清楚。我想你最后一句关于反复调用
invalidate()
的评论有点符合我的观点。在类似Android的API中,有时很难判断理想的位置是在哪里“绑定”现有流程。有些方法可能不会在您期望的所有情况下被调用,而其他方法可能会得到ca