在我的应用程序中,我有一个ViewPager,其中包含许多带有Fragments的可滑动Tabs。我使用setUserVisibleHint
方法检测Fragment
何时进入屏幕。当用户在选项卡之间滑动但在第一次加载时它不起作用时,这非常有效。要在方法中运行代码,我必须向左滑动然后再返回到第一个Fragment
,因为在setUserVisibleHint
方法之前调用了onCreateView
方法。
在第一个片段可见后,您对如何运行此代码有什么想法吗?在ViewPager
或其他什么方法中有方法吗?
答案 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方法