【问题标题】:On Android, how can you tell when an element is shown on the screen?在 Android 上,如何判断元素何时显示在屏幕上?
【发布时间】:2016-04-01 13:25:49
【问题描述】:

我希望能够知道用户何时可以真正看到我的小部件/片段中的内容(而不是只知道小部件是在折叠下方或在缓存但可能永远不会真正显示的片段中呈现的)。

我已经到处搜索了某种钩子,它可以让您知道什么时候显示在屏幕上,但找不到。这样的事情是否存在,或者这是Android忽略的事情?是否有可能以某种方式将其拼凑在一起,还是我运气不好?

谢谢!

【问题讨论】:

  • 使用该小部件/片段中的 Toast 怎么样?
  • 您是否想知道您的布局中的某个View 是否对用户可见?如果是这样,这个答案可能会对您有所帮助:stackoverflow.com/a/12428208/3962091
  • @NoChinDeluxe,问题在于它告诉你 if 一个视图是可见的,而不是 when 它变得可见。我们是否必须不断检查以找出它何时发生? Android 不应该为此举办活动吗?
  • 我很好奇你现在这个问题的背景是什么。当 Fragment 被附加、创建、恢复、可见等时,有几个回调会通知您。如果这些还不够,那么您的设计可能不理想或完全有缺陷。根据我的经验,当您对系统进行如此多的挑战并且似乎找不到任何文档时,这通常意味着您是做错事的人。反正我就是这样。
  • 我想做展示跟踪。换句话说,我想知道用户看到的最细粒度的内容。

标签: android


【解决方案1】:

来自Activity 类的文档:

活动的整个生命周期发生在第一次调用 onCreate(Bundle) 到最后一次调用 onDestroy() 之间。一个活动将在 onCreate() 中完成所有“全局”状态的设置,并在 onDestroy() 中释放所有剩余资源。例如,如果它有一个线程在后台运行以从网络下载数据,它可能会在 onCreate() 中创建该线程,然后在 onDestroy() 中停止该线程。

活动的可见生命周期发生在对 onStart() 的调用与对 onStop() 的相应调用之间。在此期间,用户可以在屏幕上看到活动,尽管它可能不在前台并与用户交互。在这两种方法之间,您可以维护向用户显示活动所需的资源。例如,您可以在 onStart() 中注册 BroadcastReceiver 以监控影响 UI 的更改,并在用户不再看到您正在显示的内容时在 onStop() 中取消注册。 onStart() 和 onStop() 方法可以多次调用,因为活动对用户可见和隐藏。

活动的前台生命周期发生在对 onResume() 的调用与对 onPause() 的相应调用之间。在此期间,活动位于所有其他活动之前并与用户交互。一个活动经常会在恢复和暂停状态之间切换——例如,当设备进入睡眠状态、传递活动结果时、传递新意图时——因此这些方法中的代码应该是相当轻量级的。

第二点和第三点似乎清楚地提到了您要查找的内容(onResume() 方法)。如果您使用片段,则适用相同的规则。 Fragment的onResume()方法会在activity的onResume()之后调用。

http://developer.android.com/reference/android/app/Activity.html http://developer.android.com/reference/android/app/Fragment.html#Lifecycle

编辑:
好吧,显然没有直接的解决方案。我有一个想法,但这更像是一种即兴创作,而不是一个适当的解决方案。此外,它可能有效,也可能无效。试试这些 -

  1. 如果您在ViewPager(带有标签)中使用片段,FragmentPagerAdapter 将在当前显示的片段上调用setUserVisibilityHint(true)。您可以在片段中使用 getUserVisibilityHint() 进行检查。
  2. 如果您使用ScrollView 作为容器,也许您可​​以监听滚动变化并确定您的片段是可见还是滚动出去。请参阅this answer 了解更多信息。
  3. 对于单个小部件,您可以使用 View.isVisible() 检查可见性。

这些选项都没有提供明确的基于事件的机制来检查可见性,但也许您可以以某种方式使用它们。一种方法是定义自己的回调,并覆盖上述方法来调用它们。如果您让这些方法(或其他方法)起作用,请告诉我。

【讨论】:

  • 这只表示片段在前台时。它可能仍然不在可见屏幕上,但可能在首屏下方。在某些(大型)设备上,它可能对用户可见。在其他人可能不是。
  • @TOB 你所说的发生在onStart() 被调用时。当onResume() 被调用时,该活动“在所有其他活动之前并与用户交互”。这确实意味着它的内容对用户是可见的。再次阅读我引用的文档。
  • 不能有两个片段一个在另一个之上,较低的片段不在屏幕上,但可以通过滚动访问?如果没有,我真的在问小部件。
  • 我会接受这个答案,因为它阐明了基于事件的解决方案不存在,并给出了可能的解决方案的指针。如果有人提出任何建议,请在此处回复!
猜你喜欢
  • 2012-03-17
  • 2012-12-11
  • 2011-11-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-04
相关资源
最近更新 更多