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
ViewPager call setUserVisibleHint after first Fragment is loaded
提问by Cilenco
In my application, I have a ViewPager which holds many swipeable Tabs with Fragments inside. I use the setUserVisibleHint
method to detect when a Fragment
comes 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 Fragment
because the setUserVisibleHint
method is called before the onCreateView
method.
在我的应用程序中,我有一个 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 ViewPager
or something else?
在第一个 Fragment 可见后,您对如何运行此代码有任何想法吗?中是否有方法ViewPager
或其他方法?
回答by Paul Burke
You can't (and shouldn't) rely on setUserVisibleHint
for 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.SimpleOnPageChangeListener
if you don't need to listen for all callbacks.
注意:ViewPager.SimpleOnPageChangeListener
如果您不需要侦听所有回调,则可以使用。
Update
更新
setOnPageChangeListener
method is now deprecated, use addOnPageChangeListener
instead
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 onCreateView
in 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.getCurrentItem
that return integer.
我不明白你到底需要什么,但你可以通过调用ViewPager.getCurrentItem
返回整数来检测当前片段的页面。
Hope it helps.
希望能帮助到你。
Good luck.
祝你好运。
回答by chinaanihchen
I check your problem,but I find out the onCreateView
method is called before the
setUserVisibleHint
method
我检查了你的问题,但我发现onCreateView
方法是在setUserVisibleHint
方法之前调用的
enter code here
because the setUserVisibleHint method is called before the onCreateView method
因为 setUserVisibleHint 方法在 onCreateView 方法之前调用