setUserVisibleHint方法在onCreateView方法之前被调用,且在首次加载时不起作用。

11 浏览
0 Comments

setUserVisibleHint方法在onCreateView方法之前被调用,且在首次加载时不起作用。

我正在使用这种方法,但它对于第一个片段不起作用,但是在从第二个片段向第一个片段滑动时它运行正常。请帮助我解决这个问题。谢谢。

@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
    super.setUserVisibleHint(isVisibleToUser);
    if (isVisibleToUser) {
        // 做一些操作
    }
}

0
0 Comments

问题出现的原因:在此代码中,setUserVisibleHint方法在onCreateView方法之前被调用。因此,在第一次加载时,view对象尚未被初始化,导致条件判断不成立,onResume方法不会被调用。

解决方法:将setUserVisibleHint方法放在onCreateView方法之后调用。这样,在第一次加载时,view对象已经被初始化,条件判断可以正确执行。

以下是修改后的代码:

    View view;
    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;
    }
    
    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();
        }
    }
    
    public void onResume() { 
        super.onResume();   
        if (!getUserVisibleHint()) {
            return;
        }
        //do your stuff here
    }

这样修改后,问题就可以得到解决。

0
0 Comments

问题的原因是在使用支持版本时,不能依赖于`setUserVisibleHint`方法的调用顺序。根据文档的说明,该方法可能在Fragment的生命周期之外被调用,因此无法保证与Fragment生命周期方法的调用顺序。

解决方法是使用`OnPageChangeListener`来确定页面何时被选中。可以通过监听`ViewPager`的页面切换事件来实现,在切换到特定页面时执行相应的操作。通过在`onPageSelected`方法中调用webapi来获取数据,并在Fragment中显示数据。

以下是一种可能的解决方法:

// 在Fragment所在的Activity中添加OnPageChangeListener
ViewPager viewPager = findViewById(R.id.viewPager);
viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
    @Override
    public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
        // 页面滚动时的操作
    }
    @Override
    public void onPageSelected(int position) {
        // 当页面被选中时执行的操作
        if (position == YOUR_FRAGMENT_POSITION) { // 判断是否为目标Fragment的位置
            // 调用webapi获取数据并显示在Fragment中
            yourFragment.loadData();
        }
    }
    @Override
    public void onPageScrollStateChanged(int state) {
        // 页面滚动状态改变时的操作
    }
});

在目标Fragment中添加`loadData`方法来获取数据并显示:

public void loadData() {
    // 调用webapi获取数据并显示在Fragment中
    // ...
}

通过这种方法,当用户切换到目标Fragment时,会触发`onPageSelected`方法,然后调用`loadData`方法来加载数据并显示在Fragment中。这样就可以在确保Fragment可见时加载数据。

0
0 Comments

当我在加载ViewPager的Fragment时,我遇到了这个问题,每当它们可见时就会加载数据。为了只在特定的Fragment可见时加载数据,我依赖于setUserVisibleHint(isVisibleToUser:Boolean),但我没有意识到它在Fragment的生命周期的哪个时刻被调用。

结果,一天两天过去了,我对于为什么所有在onCreateView()中的变量都为空一无所知。直到我查阅了一些Stack Overflow上的答案,我才意识到我犯了一个错误。

setUserVisibleHint()甚至在onCreateView()之前被调用

所以解决方法可以参考这里。看看这里最高票的答案。那个人用布尔值解决了这个问题。

希望它能帮助所有未来的访问者并节省他们的时间。

0