首页 文章

ViewPager当前碎片可见性

提问于
浏览
0

What I Have

我有一个包含5个片段的ViewPager . 我希望片段内的一些TextViews在用户可见时动画 .

我不能使用onResume(),因为左侧和右侧的片段已经创建 . 我无法使用setUserVisibilityHint(),因为它在onCreateView()之前被调用,因此视图还没有准备好 .

那么,只要特定片段对用户可见,动画视图的方式应该是什么?

4 回答

  • 0

    我不确定,但是如果你在 onCreateView 之前说 setUserVisibilityHint 调用,那么在这里查看null视图(在视图 - 字段上做引用),如果它不是null,则为它设置动画 . 也会在 onCreateView 中为它设置动画 .

  • 0

    我知道这个答案可能有点迟了,但我希望它可以在类似的情况下帮助其他人 .

    您可以使用FragmentViewPager库(我是作者),它处理您面临的问题 . 它的特点是:

    • 允许其 Fragment 页面在用户实际可见/不可见时得到通知

    • 支持多级 FragmentViewPagers (嵌套)

    • 提供了控制其分页的方法

    基本用法是:

    • 以编程方式或通过XML将 FragmentViewPager 附加到活动或片段,就像使用本机 ViewPager 一样

    • 设置 FragmentViewPager 的适配器 . 您的适配器应继承 com.sbrukhanda.fragmentviewpager.adapters.FragmentPagerAdaptercom.sbrukhanda.fragmentviewpager.adapters.FragmentStatePagerAdapter

    • 覆盖托管活动的 onResumeFragments() 并致电 FragmentViewPager.notifyPagerVisible()

    private FragmentViewPager mFragmentsPager;
    
    @Override 
    public void onResumeFragments() {
        super.onResumeFragments();
        mFragmentsPager.notifyPagerVisible();
        ... 
    }
    

    onResume() 托管片段并致电 FragmentViewPager.notifyPagerVisible()

    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

    • 你准备好了!

    如果您希望查看更完整的示例代码,请检查项目的sample project .

  • 1

    如果要在单个片段中执行此操作,则可以在片段转换中为每个片段使用 isVisible() 并创建一个侦听器 . 每当片段变得可见时,将调用侦听器,并且每个片段将实现该侦听器并在重写方法中执行您的预期任务 .

  • 1

    (1)我不能使用onResume(),因为左侧和右侧的片段已经创建 . (2)我不能使用在onCreateView()之前调用的setUserVisibilityHint(),因此视图还没有准备好 . 那么,只要特定片段对用户可见,动画视图的方式应该是什么?

    你是对(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)声明两个全局布尔字段: isAnimatedisOnDisplay

    a.1)将 isAnimated 布尔值设置为True;

    b)覆盖 setUserVisibilityHint(boolean isVisibleToUser)

    在这里你将 isOnDisplay 布尔值设置为 isVisibleToUser 并检查片段是否已经过动画并且处于恢复状态并且对用户可见 .

    { if(!isAnimated && isResumed() && isVisibleToUser) // DO Animation }
    

    c)覆盖 onResume()

    检查片段是否已经过动画并且对用户是否可见 .

    { if(!isAnimated && isVisibleToUser) // DO Animation }
    

相关问题