Android ViewPager 在第一个 Fragment 加载后调用 setUserVisibleHint

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/25667657/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-20 09:38:25  来源:igfitidea点击:

ViewPager call setUserVisibleHint after first Fragment is loaded

androidandroid-fragmentsandroid-viewpager

提问by Cilenco

In my application, I have a ViewPager which holds many swipeable Tabs with Fragments inside. I use the setUserVisibleHintmethod to detect when a Fragmentcomes to the screen. This works great when the user swipes between tabs but it does not work on the first load. To run the code in the method I have to swipe to left and then back to the first Fragmentbecause the setUserVisibleHintmethod is called before the onCreateViewmethod.

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

Do you have any ideas how I can run this code after the first Fragment is visible? Is there a method in the ViewPageror something else?

在第一个 Fragment 可见后,您对如何运行此代码有任何想法吗?中是否有方法ViewPager或其他方法?

回答by Paul Burke

You can't (and shouldn't) rely on setUserVisibleHintfor this. Instead, you should be using a ViewPager.OnPageChangeListenerto get callbacks for when a page becomes visible. E.g.

你不能(也不应该)依赖setUserVisibleHint于此。相反,您应该使用ViewPager.OnPageChangeListener来获取页面可见时的回调。例如

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

Note: You can use ViewPager.SimpleOnPageChangeListenerif you don't need to listen for all callbacks.

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

Update

更新

setOnPageChangeListenermethod is now deprecated, use addOnPageChangeListenerinstead

setOnPageChangeListener方法现已弃用,请addOnPageChangeListener改用

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

回答by Rahul

BELOW WORKED FOR ME

以下为我工作

Please create a global view like this

请创建这样的全局视图

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;
    }

and use this

并使用这个

 @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();
                }

        }

and In OnResume method

和 OnResume 方法

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

回答by Yuraj

You have to call manually mViewPagerListener.onPageSelected(0);in onCreateViewin your root activity/fragment.

你必须手动调用mViewPagerListener.onPageSelected(0);onCreateView您的根系活力/片段。

回答by kara4k

Well, its workaround more, and maybe its better to setup OnPageChangeListener, but it works for me. The task is to determine whether the current fragment is visible at creation. You can use the menu to do this. In your fragment:

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

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

and this

和这个

 @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;

Maybe someone will find it usefull. This works for me.

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

回答by Emre Aktürk

I dont understand what you need exactly but you can detect the page of the current fragment by calling ViewPager.getCurrentItemthat return integer.

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

Hope it helps.

希望能帮助到你。

Good luck.

祝你好运。

回答by chinaanihchen

I check your problem,but I find out the onCreateViewmethod is called before the setUserVisibleHintmethod

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

enter code here

because the setUserVisibleHint method is called before the onCreateView method

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