ViewPager当前碎片可见性

时间:2015-05-16 08:41:04

标签: android android-viewpager android-animation android-lifecycle

我有什么

我有一个包含5个片段的ViewPager。我希望片段中的一些TextView在用户可见时动画。

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

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

4 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

  

(1)我不能使用onResume(),因为左侧和右侧的片段已经创建。   (2)我无法使用setUserVisibilityHint(),因为它在onCreateView()之前调用,因此视图尚未就绪。

     

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

你在(1)和(2)上是对的。但是,在片段显示在Front上之后, setUserVisibilityHint()会再次调用 并带有 True 值。但是在首次运行时,要显示的片段会在setUserVisibilityHint()之前调用onCreateView()

SOL:只要特定片段对用户可见,您就应该使用setUserVisibilityHint()onResume()的上述行为来为视图设置动画。

  • 场景1 :首次运行:显示的片段setUserVisibilityHint(boolean isVisibleToUser)被调用 真正的参数价值。但是由于片段的状态未恢复,我们推迟并让onResume()处理动画。
  • 场景2 :对于已处于“恢复状态”的其他片段,将调用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 }

答案 2 :(得分:1)

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

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

  • 允许其Fragment个网页实际收到通知 用户可见/不可见
  • 支持多个级别的FragmentViewPagers(嵌套)
  • 提供控制其分页的方法

基本用法是:

  1. 以编程方式或通过XML将FragmentViewPager附加到活动 或片段,就像使用原生ViewPager
  2. 一样
  3. 设置FragmentViewPager的适配器。你的适配器应该继承 com.sbrukhanda.fragmentviewpager.adapters.FragmentPagerAdaptercom.sbrukhanda.fragmentviewpager.adapters.FragmentStatePagerAdapter
  4. 覆盖托管活动的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();
        ... 
    }
    
  5. 覆盖托管活动或片段的onPause()并致电 FragmentViewPager.notifyPagerInvisible()

    private FragmentViewPager mFragmentsPager;
    
    @Override 
    public void onPause() {
        super.onPause();
        mFragmentsPager.notifyPagerInvisible();
        ... 
    }
    
  6. 在您的所有Fragment页面上实施FragmentVisibilityListener 希望收到其可见性状态的回调
  7. 你准备好了!
  8. 如果您希望查看更完整的示例代码,请查看项目sample project

答案 3 :(得分:0)

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