加载第一个Fragment后,ViewPager调用setUserVisibleHint

时间:2014-09-04 14:09:14

标签: android android-fragments android-viewpager

在我的应用程序中,我有一个ViewPager,其中包含许多带有Fragments的可滑动Tabs。我使用setUserVisibleHint方法检测Fragment何时进入屏幕。当用户在选项卡之间滑动但在第一次加载时它不起作用时,这非常有效。要在方法中运行代码,我必须向左滑动然后再返回到第一个Fragment,因为在setUserVisibleHint方法之前调用了onCreateView方法。

在第一个片段可见后,您对如何运行此代码有什么想法吗?在ViewPager或其他什么方法中有方法吗?

6 个答案:

答案 0 :(得分:58)

你不能(并且不应该)依赖setUserVisibleHint。相反,您应该使用ViewPager.OnPageChangeListener来获取页面变得可见时的回调。 E.g。

viewPager.setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() {
    @Override
    public void onPageSelected(int position) {
        // do your work
    } 
});

注意:如果您不需要收听所有回调,则可以使用ViewPager.SimpleOnPageChangeListener

更新

现在不推荐使用

setOnPageChangeListener方法,而是使用addOnPageChangeListener

viewPager.addOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() {
    @Override
    public void onPageSelected(int position) {
        // do your work
    } 
});

答案 1 :(得分:4)

以下为我工作

请创建像这样的全局视图

View view;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState)
    {
        //inflate view layout
        view =inflater.inflate(R.layout.your_fragment, container, false);

        // return view
        return view;
    }

并使用此

 @Override
        public void setUserVisibleHint(boolean isUserVisible)
        {
            super.setUserVisibleHint(isUserVisible);
           // when fragment visible to user and view is not null then enter here.
                if (isUserVisible && view != null)
                {
                   onResume();
                }

        }

和OnResume方法

@Override
         public void onResume() { 
         super.onResume();   
            if (!getUserVisibleHint()) {
            return;
          }
      //do your stuff here
   }

答案 2 :(得分:3)

您必须在根活动/片段中的mViewPagerListener.onPageSelected(0);中手动调用onCreateView

答案 3 :(得分:0)

我不明白你需要什么,但你可以通过调用返回整数的ViewPager.getCurrentItem来检测当前片段的页面。

希望它有所帮助。

祝你好运。

答案 4 :(得分:0)

嗯,它的解决方法更多,也许更好地设置OnPageChangeListener,但它对我有用。任务是确定当前片段在创建时是否可见。您可以使用菜单执行此操作。在你的片段中:

 @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setHasOptionsMenu(true); // set current fragment has its own options menu
    } 

和这个

 @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
     ...

            if(isMenuVisible()) { // menu should be visible if current fragment is visible right now
                setUserVisibleHint(true); // manually set value to true
            }
     ...
    return view;

也许有人会发现它很有用。这对我有用。

答案 5 :(得分:-6)

我检查了你的问题,但我发现onCreateView方法在调用之前被调用了 setUserVisibleHint方法

enter code here
  

因为在onCreateView方法之前调用了setUserVisibleHint方法