What I Have
我有一个包含5个片段的ViewPager . 我希望片段内的一些TextViews在用户可见时动画 .
我不能使用onResume(),因为左侧和右侧的片段已经创建 . 我无法使用setUserVisibilityHint(),因为它在onCreateView()之前被调用,因此视图还没有准备好 .
那么,只要特定片段对用户可见,动画视图的方式应该是什么?
我不确定,但是如果你在 onCreateView 之前说 setUserVisibilityHint 调用,那么在这里查看null视图(在视图 - 字段上做引用),如果它不是null,则为它设置动画 . 也会在 onCreateView 中为它设置动画 .
onCreateView
setUserVisibilityHint
我知道这个答案可能有点迟了,但我希望它可以在类似的情况下帮助其他人 .
您可以使用FragmentViewPager库(我是作者),它处理您面临的问题 . 它的特点是:
允许其 Fragment 页面在用户实际可见/不可见时得到通知
Fragment
支持多级 FragmentViewPagers (嵌套)
FragmentViewPagers
提供了控制其分页的方法
基本用法是:
以编程方式或通过XML将 FragmentViewPager 附加到活动或片段,就像使用本机 ViewPager 一样
FragmentViewPager
ViewPager
设置 FragmentViewPager 的适配器 . 您的适配器应继承 com.sbrukhanda.fragmentviewpager.adapters.FragmentPagerAdapter 或 com.sbrukhanda.fragmentviewpager.adapters.FragmentStatePagerAdapter
com.sbrukhanda.fragmentviewpager.adapters.FragmentPagerAdapter
com.sbrukhanda.fragmentviewpager.adapters.FragmentStatePagerAdapter
覆盖托管活动的 onResumeFragments() 并致电 FragmentViewPager.notifyPagerVisible() :
onResumeFragments()
FragmentViewPager.notifyPagerVisible()
private FragmentViewPager mFragmentsPager; @Override public void onResumeFragments() { super.onResumeFragments(); mFragmentsPager.notifyPagerVisible(); ... }
或 onResume() 托管片段并致电 FragmentViewPager.notifyPagerVisible() :
onResume()
private FragmentViewPager mFragmentsPager; @Override public void onResume() { super.onResume(); mFragmentsPager.notifyPagerVisible(); ... }
onPause()
FragmentViewPager.notifyPagerInvisible()
private FragmentViewPager mFragmentsPager; @Override public void onPause() { super.onPause(); mFragmentsPager.notifyPagerInvisible(); ... }
在您希望接收其可见性状态回调的所有Fragment页面上实施 FragmentVisibilityListener
FragmentVisibilityListener
你准备好了!
如果您希望查看更完整的示例代码,请检查项目的sample project .
如果要在单个片段中执行此操作,则可以在片段转换中为每个片段使用 isVisible() 并创建一个侦听器 . 每当片段变得可见时,将调用侦听器,并且每个片段将实现该侦听器并在重写方法中执行您的预期任务 .
isVisible()
(1)我不能使用onResume(),因为左侧和右侧的片段已经创建 . (2)我不能使用在onCreateView()之前调用的setUserVisibilityHint(),因此视图还没有准备好 . 那么,只要特定片段对用户可见,动画视图的方式应该是什么?
你是对(1)和(2) . 但是,片段到达显示前面后 setUserVisibilityHint() gets called Once Again 的值为 True . 但是在第一次运行时,要显示的片段会在 onCreateView() 之前调用 setUserVisibilityHint() .
onCreateView()
setUserVisibilityHint()
SOL:只要特定片段对用户可见,您就应该使用 setUserVisibilityHint() 的上述行为以及 onResume() 来为视图设置动画 .
场景1:首次运行:使用True参数值调用显示的片段 setUserVisibilityHint(boolean isVisibleToUser) . 但由于片段的状态未恢复,我们推迟并让 onResume() 处理动画 .
setUserVisibilityHint(boolean isVisibleToUser)
场景2:对于已经处于恢复状态的其他片段,将使用True参数调用 setUserVisibilityHint(boolean isVisibleToUser) ,它们将显示在“显示”上 . 在这里,您可以检查片段动画与否以及动画 .
CODE
a)声明两个全局布尔字段: isAnimated 和 isOnDisplay
isAnimated
isOnDisplay
a.1)将 isAnimated 布尔值设置为True;
b)覆盖 setUserVisibilityHint(boolean isVisibleToUser) :
在这里你将 isOnDisplay 布尔值设置为 isVisibleToUser 并检查片段是否已经过动画并且处于恢复状态并且对用户可见 .
isVisibleToUser
{ if(!isAnimated && isResumed() && isVisibleToUser) // DO Animation }
c)覆盖 onResume()
检查片段是否已经过动画并且对用户是否可见 .
{ if(!isAnimated && isVisibleToUser) // DO Animation }
4 回答
我不确定,但是如果你在
onCreateView
之前说setUserVisibilityHint
调用,那么在这里查看null视图(在视图 - 字段上做引用),如果它不是null,则为它设置动画 . 也会在onCreateView
中为它设置动画 .我知道这个答案可能有点迟了,但我希望它可以在类似的情况下帮助其他人 .
您可以使用FragmentViewPager库(我是作者),它处理您面临的问题 . 它的特点是:
允许其
Fragment
页面在用户实际可见/不可见时得到通知支持多级
FragmentViewPagers
(嵌套)提供了控制其分页的方法
基本用法是:
以编程方式或通过XML将
FragmentViewPager
附加到活动或片段,就像使用本机ViewPager
一样设置
FragmentViewPager
的适配器 . 您的适配器应继承com.sbrukhanda.fragmentviewpager.adapters.FragmentPagerAdapter
或com.sbrukhanda.fragmentviewpager.adapters.FragmentStatePagerAdapter
覆盖托管活动的
onResumeFragments()
并致电FragmentViewPager.notifyPagerVisible()
:或
onResume()
托管片段并致电FragmentViewPager.notifyPagerVisible()
:onPause()
并调用FragmentViewPager.notifyPagerInvisible()
:在您希望接收其可见性状态回调的所有Fragment页面上实施
FragmentVisibilityListener
你准备好了!
如果您希望查看更完整的示例代码,请检查项目的sample project .
如果要在单个片段中执行此操作,则可以在片段转换中为每个片段使用
isVisible()
并创建一个侦听器 . 每当片段变得可见时,将调用侦听器,并且每个片段将实现该侦听器并在重写方法中执行您的预期任务 .你是对(1)和(2) . 但是,片段到达显示前面后 setUserVisibilityHint() gets called Once Again 的值为 True . 但是在第一次运行时,要显示的片段会在
onCreateView()
之前调用setUserVisibilityHint()
.SOL:只要特定片段对用户可见,您就应该使用
setUserVisibilityHint()
的上述行为以及onResume()
来为视图设置动画 .场景1:首次运行:使用True参数值调用显示的片段
setUserVisibilityHint(boolean isVisibleToUser)
. 但由于片段的状态未恢复,我们推迟并让onResume()
处理动画 .场景2:对于已经处于恢复状态的其他片段,将使用True参数调用
setUserVisibilityHint(boolean isVisibleToUser)
,它们将显示在“显示”上 . 在这里,您可以检查片段动画与否以及动画 .CODE
a)声明两个全局布尔字段:
isAnimated
和isOnDisplay
a.1)将
isAnimated
布尔值设置为True;b)覆盖
setUserVisibilityHint(boolean isVisibleToUser)
:在这里你将
isOnDisplay
布尔值设置为isVisibleToUser
并检查片段是否已经过动画并且处于恢复状态并且对用户可见 .c)覆盖
onResume()
检查片段是否已经过动画并且对用户是否可见 .