问题:ViewPager
中的片段 onResume()
在片段实际可见之前被触发。
例如,我有 2 个带有 ViewPager
和 FragmentPagerAdapter
的片段。第二个片段仅适用于授权用户,我需要在片段可见时要求用户登录(使用警报对话框)。
但是 ViewPager
在第一个片段可见时创建第二个片段,以便缓存第二个片段并在用户开始滑动时使其可见。
因此,onResume()
事件在第二个片段变得可见之前很久就在第二个片段中被触发。这就是为什么我试图找到一个在第二个片段变得可见时触发的事件以在适当的时刻显示一个对话框。
如何才能做到这一点?
ViewPager
中。在两页寻呼机中,无论您喜欢与否,都会立即加载两个页面。 ViewPager
的用户体验应该是内容在滑动时立即出现,而不是稍后。这就是为什么 ViewPager
在可见页面之前初始化页面,以帮助确保用户体验。
如何确定 Fragment 何时在 ViewPager 中可见
您可以通过覆盖 Fragment
中的 setUserVisibleHint
来执行以下操作:
public class MyFragment extends Fragment {
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
if (isVisibleToUser) {
}
else {
}
}
}
更新:Android 支持库 (rev 11) 最后是 fixed the user visible hint issue,现在如果您使用片段的支持库,那么您可以安全地使用 getUserVisibleHint()
或覆盖 setUserVisibleHint()
来捕获更改,如戈恩的回答。
更新 1 这是 getUserVisibleHint()
的一个小问题。此值默认为 true
。
// Hint provided by the app that this fragment is currently visible to the user.
boolean mUserVisibleHint = true;
因此,在调用 setUserVisibleHint()
之前尝试使用它可能会出现问题。作为一种解决方法,您可以像这样在 onCreate
方法中设置值。
public void onCreate(@Nullable Bundle savedInstanceState) {
setUserVisibleHint(false);
过时的答案:
在大多数用例中,ViewPager
一次只显示一页,但如果您在 Android Support Library pre-r11
中使用 FragmentStatePagerAdapter
,预缓存的片段也会进入“可见”状态(实际上不可见)。
我覆盖:
public class MyFragment extends Fragment {
@Override
public void setMenuVisibility(final boolean visible) {
super.setMenuVisibility(visible);
if (visible) {
// ...
}
}
// ...
}
捕获片段的焦点状态,我认为这是您所说的“可见性”最合适的状态,因为 ViewPager 中只有一个片段实际上可以将其菜单项与父活动的项放在一起。
onCreateOptionsMenu
时,我得到了 getUserVisibleHint() 的 true
,而当调用 setUserVisibleHint
时,似乎还没有创建菜单。最终,当我只想要可见片段中的菜单时,我添加了两个选项菜单。在这方面有什么建议吗?
setUserVisibleHint
现在已弃用
这似乎恢复了您所期望的正常 onResume()
行为。按 Home 键离开应用程序然后重新进入应用程序时效果很好。 onResume()
不会连续调用两次。
@Override
public void setUserVisibleHint(boolean visible)
{
super.setUserVisibleHint(visible);
if (visible && isResumed())
{
//Only manually call onResume if fragment is already visible
//Otherwise allow natural fragment lifecycle to call onResume
onResume();
}
}
@Override
public void onResume()
{
super.onResume();
if (!getUserVisibleHint())
{
return;
}
//INSERT CUSTOM CODE HERE
}
onCreateView
之前调用 setUserVisibleHint
的问题,并且如果应用程序进入后台然后进入前台,则不会调用 setUserVisibleHint
。惊人的!谢谢!
onVisibleToUser()
方法并从 onResume()
和 setUserVisibleHint(boolean)
调用它,而不是自己调用 onResume()
并干扰生命周期回调。否则我认为这种方法效果很好,谢谢!
这是使用 onPageChangeListener
的另一种方式:
ViewPager pager = (ViewPager) findByViewId(R.id.viewpager);
FragmentPagerAdapter adapter = new FragmentPageAdapter(getFragmentManager);
pager.setAdapter(adapter);
pager.setOnPageChangeListener(new OnPageChangeListener() {
public void onPageSelected(int pageNumber) {
// Just define a callback method in your fragment and call it like this!
adapter.getItem(pageNumber).imVisible();
}
public void onPageScrolled(int arg0, float arg1, int arg2) {
// TODO Auto-generated method stub
}
public void onPageScrollStateChanged(int arg0) {
// TODO Auto-generated method stub
}
});
ViewPager
,那么一次只能看到一个片段,对吗?所以我们不能假设其余的都是隐藏的,除了 onPageSelected
被调用的那个吗?
setUserVisibleHint()
有时会在之前 onCreateView()
被调用,有时在这之后会引起麻烦。
要克服这个问题,您还需要在 setUserVisibleHint()
方法中检查 isResumed()
。但在这种情况下,我意识到 setUserVisibleHint()
仅在 Fragment 恢复且可见时才被调用,而不是在创建时调用。
因此,如果您想在 Fragment 为 visible
时更新某些内容,请将更新函数放在 onCreate()
和 setUserVisibleHint()
中:
@Override
public View onCreateView(...){
...
myUIUpdate();
...
}
....
@Override
public void setUserVisibleHint(boolean visible){
super.setUserVisibleHint(visible);
if (visible && isResumed()){
myUIUpdate();
}
}
更新: 我仍然意识到 myUIUpdate()
有时会被调用两次,原因是,如果您有 3 个选项卡并且此代码位于第二个选项卡上,那么当您第一次打开第一个选项卡时,也会创建第二个选项卡即使它不可见并且调用了 myUIUpdate()
。然后,当您滑动到第二个标签时,会调用 if (visible && isResumed())
中的 myUIUpdate()
,因此,myUIUpdate()
可能会在一秒钟内被调用两次。
另一个问题是 setUserVisibleHint
中的 !visible
在 1) 当您离开片段屏幕时和 2) 在它创建之前,当您第一次切换到片段屏幕时被调用。
解决方案:
private boolean fragmentResume=false;
private boolean fragmentVisible=false;
private boolean fragmentOnCreated=false;
...
@Override
public View onCreateView(...){
...
//Initialize variables
if (!fragmentResume && fragmentVisible){ //only when first time fragment is created
myUIUpdate();
}
...
}
@Override
public void setUserVisibleHint(boolean visible){
super.setUserVisibleHint(visible);
if (visible && isResumed()){ // only at fragment screen is resumed
fragmentResume=true;
fragmentVisible=false;
fragmentOnCreated=true;
myUIUpdate();
}else if (visible){ // only at fragment onCreated
fragmentResume=false;
fragmentVisible=true;
fragmentOnCreated=true;
}
else if(!visible && fragmentOnCreated){// only when you go out of fragment screen
fragmentVisible=false;
fragmentResume=false;
}
}
解释:
fragmentResume
,fragmentVisible
:确保仅在片段创建且可见时调用 onCreateView()
中的 myUIUpdate()
,而不是在恢复时调用。它还解决了您在第一个选项卡时的问题,即使第二个选项卡不可见也会创建。这解决了这个问题并检查在 onCreate
时片段屏幕是否可见。
fragmentOnCreated
:确保片段不可见,并且在您第一次创建片段时不被调用。所以现在这个 if 子句只有在你滑出片段时才会被调用。
更新您可以将所有这些代码放入BaseFragment
代码like this并覆盖方法。
setUserVisibleHint
没有得到称呼..!在 onCreateView
方法中,fragmentVisible
是 false
!?所以片段显示为空..!有什么想法吗。?
在版本 androidx.fragment:fragment:1.1.0
的 ViewPager2
和 ViewPager
中,您可以只使用 onPause
和 onResume
回调来确定当前对用户可见的片段。当片段变得可见时调用 onResume
回调,当它停止可见时调用 onPause
。
在 ViewPager2 的情况下,它是默认行为,但可以轻松地为旧的 ViewPager
启用相同的行为。
要在第一个 ViewPager 中启用此行为,您必须将 FragmentPagerAdapter.BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT
参数作为 FragmentPagerAdapter
构造函数的第二个参数传递。
FragmentPagerAdapter(fragmentManager, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT)
注意:带有一个参数的 setUserVisibleHint()
方法和 FragmentPagerAdapter
构造函数现在在来自 android jetpack 的 Fragment 的新版本中已弃用。
新的
ViewPager2
+ FragmentStateAdapter
+ onResume()
(在 Fragment 中)解决问题
旧答案(已弃用)
要在 ViewPager
可见中检测 Fragment
,我很确定仅使用 setUserVisibleHint
是不够的。
这是我检查片段是否可见或不可见的解决方案。首先在启动viewpager时,在页面之间切换,转到另一个活动/片段/背景/前景`
public class BaseFragmentHelpLoadDataWhenVisible extends Fragment {
protected boolean mIsVisibleToUser; // you can see this variable may absolutely <=> getUserVisibleHint() but it not. Currently, after many test I find that
/**
* This method will be called when viewpager creates fragment and when we go to this fragment background or another activity or fragment
* NOT called when we switch between each page in ViewPager
*/
@Override
public void onStart() {
super.onStart();
if (mIsVisibleToUser) {
onVisible();
}
}
@Override
public void onStop() {
super.onStop();
if (mIsVisibleToUser) {
onInVisible();
}
}
/**
* This method will called at first time viewpager created and when we switch between each page
* NOT called when we go to background or another activity (fragment) when we go back
*/
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
mIsVisibleToUser = isVisibleToUser;
if (isResumed()) { // fragment have created
if (mIsVisibleToUser) {
onVisible();
} else {
onInVisible();
}
}
}
public void onVisible() {
Toast.makeText(getActivity(), TAG + "visible", Toast.LENGTH_SHORT).show();
}
public void onInVisible() {
Toast.makeText(getActivity(), TAG + "invisible", Toast.LENGTH_SHORT).show();
}
}
解释你可以仔细检查下面的logcat然后我想你可能知道为什么这个解决方案会起作用
首次发射
Fragment1: setUserVisibleHint: isVisibleToUser=false isResumed=false
Fragment2: setUserVisibleHint: isVisibleToUser=false isResumed=false
Fragment3: setUserVisibleHint: isVisibleToUser=false isResumed=false
Fragment1: setUserVisibleHint: isVisibleToUser=true isResumed=false // AT THIS TIME isVisibleToUser=true but fragment still not created. If you do something with View here, you will receive exception
Fragment1: onCreateView
Fragment1: onStart mIsVisibleToUser=true
Fragment2: onCreateView
Fragment3: onCreateView
Fragment2: onStart mIsVisibleToUser=false
Fragment3: onStart mIsVisibleToUser=false
转到第 2 页
Fragment1: setUserVisibleHint: isVisibleToUser=false isResumed=true
Fragment2: setUserVisibleHint: isVisibleToUser=true isResumed=true
转到第 3 页
Fragment2: setUserVisibleHint: isVisibleToUser=false isResumed=true
Fragment3: setUserVisibleHint: isVisibleToUser=true isResumed=true
转到背景:
Fragment1: onStop mIsVisibleToUser=false
Fragment2: onStop mIsVisibleToUser=false
Fragment3: onStop mIsVisibleToUser=true
转到前台
Fragment1: onStart mIsVisibleToUser=false
Fragment2: onStart mIsVisibleToUser=false
Fragment3: onStart mIsVisibleToUser=true
希望有帮助
SubChildContainerFragment
用于检测 a fragment has another view pager which also consists fragment
。您可以将 SubChildContainerFragment
和 ChildContainerFragment
混合为 1 个类。希望它有所帮助。我稍后会发布完整的答案
package com.example.com.ui.fragment;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import com.example.com.R;
public class SubscribeFragment extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_subscribe, container, false);
return view;
}
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
if (isVisibleToUser) {
// called here
}
}
@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
}
}
setUserVisibleHint
已弃用
覆盖 FragmentPagerAdapter
子类中的 setPrimaryItem()
。我用这个方法,效果很好。
@Override
public void setPrimaryItem(ViewGroup container, int position, Object object) {
// This is what calls setMenuVisibility() on the fragments
super.setPrimaryItem(container, position, object);
if (object instanceof MyWhizBangFragment) {
MyWhizBangFragment fragment = (MyWhizBangFragment) object;
fragment.doTheThingYouNeedToDoOnBecomingVisible();
}
}
为此覆盖 Fragment.onHiddenChanged()
。
public void onHiddenChanged(boolean hidden) 当片段的隐藏状态(由 isHidden() 返回)改变时调用。片段开始时没有隐藏;每当片段改变状态时,都会调用它。参数 hidden - boolean:如果片段现在隐藏,则为 true,如果不可见,则为 false。
只有这对我有用!并且 setUserVisibleHint(...)
现在已弃用(我在最后附上了文档),这意味着大多数其他答案已弃用;-)
public class FragmentFirewall extends Fragment {
/**
* Required cause "setMenuVisibility(...)" is not guaranteed to be
* called after "onResume()" and/or "onCreateView(...)" method.
*/
protected void didVisibilityChange() {
Activity activity = getActivity();
if (isResumed() && isMenuVisible()) {
// Once resumed and menu is visible, at last
// our Fragment is really visible to user.
}
}
@Override
public void onResume() {
super.onResume();
didVisibilityChange();
}
@Override
public void setMenuVisibility(boolean visible) {
super.setMenuVisibility(visible);
didVisibilityChange();
}
}
经过测试并与 NaviagationDrawer
一起工作,isMenuVisible()
将始终返回 true
(并且 onResume()
似乎足够了,但我们也希望支持 ViewPager
)。
不推荐使用 setUserVisibleHint。如果重写此方法,则传入 true 时实现的行为应移至 Fragment.onResume(),传入 false 时实现的行为应移至 Fragment.onPause()。
setUserVisibleHint(boolean visible) 现在已弃用所以这是正确的解决方案
FragmentPagerAdapter(fragmentManager, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT)
在版本 androidx.fragment:fragment:1.1.0
的 ViewPager2 和 ViewPager 中,您可以只使用 onPause()
和 onResume()
来确定当前对用户可见的片段。当片段变得可见时调用 onResume()
,当它停止可见时调用 onPause
。
要在第一个 ViewPager 中启用此行为,您必须将 FragmentPagerAdapter.BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT
参数作为 FragmentPagerAdapter
构造函数的第二个参数传递。
我发现 onCreateOptionsMenu
和 onPrepareOptionsMenu
方法仅在片段真正可见的情况下调用。我找不到任何类似这些行为的方法,我也尝试了 OnPageChangeListener
但它不适用于这种情况,例如,我需要在 onCreate
方法中初始化的变量。
所以这两种方法可以作为一种解决方法来解决这个问题,特别是对于小而短的工作。
我认为,这是更好的解决方案,但不是最好的。我将使用它,但同时等待更好的解决方案。
问候。
另一个解决方案 posted here overriding setPrimaryItem in the pageradapter by kris larson 几乎对我有用。但是每个设置都会多次调用此方法。我还从片段中的视图等中获得了 NPE,因为在调用此方法的前几次它还没有准备好。通过以下更改,这对我有用:
private int mCurrentPosition = -1;
@Override
public void setPrimaryItem(ViewGroup container, int position, Object object) {
super.setPrimaryItem(container, position, object);
if (position == mCurrentPosition) {
return;
}
if (object instanceof MyWhizBangFragment) {
MyWhizBangFragment fragment = (MyWhizBangFragment) object;
if (fragment.isResumed()) {
mCurrentPosition = position;
fragment.doTheThingYouNeedToDoOnBecomingVisible();
}
}
}
在片段内添加以下代码
@Override
public void setMenuVisibility(final boolean visible)
{
super.setMenuVisibility(visible);
if (visible && isResumed())
{
}
}
我在使用 FragmentStatePagerAdapters
和 3 个标签时遇到了同样的问题。每当单击第一个选项卡时,我都必须显示一个 Dilaog,并在单击其他选项卡时将其隐藏。
单独覆盖 setUserVisibleHint()
并不能帮助找到当前可见的片段。
从第 3 个选项卡单击时 -----> 第一个选项卡。它为第二个片段和第一个片段触发了两次。我将它与 isResumed() 方法结合使用。
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
isVisible = isVisibleToUser;
// Make sure that fragment is currently visible
if (!isVisible && isResumed()) {
// Call code when Fragment not visible
} else if (isVisible && isResumed()) {
// Call code when Fragment becomes visible.
}
}
我们有一个 MVP 的特殊情况,即 Fragment 需要通知 Presenter 视图已经可见,并且 Presenter 是由 Dagger 在 fragment.onAttach()
中注入的。
setUserVisibleHint()
还不够,我们检测到需要解决的 3 种不同情况(提及 onAttach()
是为了让您知道演示者何时有空):
刚刚创建了片段。系统进行以下调用: setUserVisibleHint() // 在片段的生命周期调用之前,所以 Presenter 为空 onAttach() ... onResume() 片段已经创建并且主页按钮被按下。将应用程序恢复到前台时,这称为: onResume() 方向更改:onAttach() // 演示者可用 onResume() setUserVisibleHint()
我们只希望可见性提示到达演示者一次,所以我们是这样做的:
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View root = inflater.inflate(R.layout.fragment_list, container, false);
setHasOptionsMenu(true);
if (savedInstanceState != null) {
lastOrientation = savedInstanceState.getInt(STATE_LAST_ORIENTATION,
getResources().getConfiguration().orientation);
} else {
lastOrientation = getResources().getConfiguration().orientation;
}
return root;
}
@Override
public void onResume() {
super.onResume();
presenter.onResume();
int orientation = getResources().getConfiguration().orientation;
if (orientation == lastOrientation) {
if (getUserVisibleHint()) {
presenter.onViewBecomesVisible();
}
}
lastOrientation = orientation;
}
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
if (presenter != null && isResumed() && isVisibleToUser) {
presenter.onViewBecomesVisible();
}
}
@Override public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putInt(STATE_LAST_ORIENTATION, lastOrientation);
}
被 focused view
检测到!
这对我有用
public static boolean isFragmentVisible(Fragment fragment) {
Activity activity = fragment.getActivity();
View focusedView = fragment.getView().findFocus();
return activity != null
&& focusedView != null
&& focusedView == activity.getWindow().getDecorView().findFocus();
}
我用了这个,它奏效了!
mContext.getWindow().getDecorView().isShown() //boolean
我支持带有子片段的 SectionsPagerAdapter 所以经过很多头痛后,我终于得到了基于该主题解决方案的工作版本:
public abstract class BaseFragment extends Fragment {
private boolean visible;
private boolean visibilityHintChanged;
/**
* Called when the visibility of the fragment changed
*/
protected void onVisibilityChanged(View view, boolean visible) {
}
private void triggerVisibilityChangedIfNeeded(boolean visible) {
if (this.visible == visible || getActivity() == null || getView() == null) {
return;
}
this.visible = visible;
onVisibilityChanged(getView(), visible);
}
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (!visibilityHintChanged) {
setUserVisibleHint(false);
}
}
@Override
public void onResume() {
super.onResume();
if (getUserVisibleHint() && !isHidden()) {
triggerVisibilityChangedIfNeeded(true);
}
}
@Override
public void onHiddenChanged(boolean hidden) {
super.onHiddenChanged(hidden);
triggerVisibilityChangedIfNeeded(!hidden);
}
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
visibilityHintChanged = true;
if (isVisibleToUser && isResumed() && !isHidden()) {
triggerVisibilityChangedIfNeeded(true);
} else if (!isVisibleToUser) {
triggerVisibilityChangedIfNeeded(false);
}
}
@Override
public void onPause() {
super.onPause();
triggerVisibilityChangedIfNeeded(false);
}
@Override
public void onStop() {
super.onStop();
triggerVisibilityChangedIfNeeded(false);
}
protected boolean isReallyVisible() {
return visible;
}
}
请注意,在活动/片段停止时不会调用 setUserVisibleHint(false)
。您仍然需要检查启动/停止以正确register/unregister
任何侦听器/等。
此外,如果您的片段以不可见状态开始,您将获得 setUserVisibleHint(false)
;您不想unregister
在那里,因为您以前从未在这种情况下注册过。
@Override
public void onStart() {
super.onStart();
if (getUserVisibleHint()) {
// register
}
}
@Override
public void onStop() {
if (getUserVisibleHint()) {
// unregister
}
super.onStop();
}
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
if (isVisibleToUser && isResumed()) {
// register
if (!mHasBeenVisible) {
mHasBeenVisible = true;
}
} else if (mHasBeenVisible){
// unregister
}
}
当我试图让计时器在视图页面中的片段在屏幕上供用户查看时触发时,我遇到了这个问题。
计时器总是在用户看到片段之前启动。这是因为在我们看到片段之前调用了片段中的 onResume()
方法。
我的解决方案是检查 onResume()
方法。当片段 8 是视图寻呼机当前片段时,我想调用某个方法 'foo()'。
@Override
public void onResume() {
super.onResume();
if(viewPager.getCurrentItem() == 8){
foo();
//Your code here. Executed when fragment is seen by user.
}
}
希望这可以帮助。我已经看到这个问题弹出了很多。这似乎是我见过的最简单的解决方案。许多其他的与较低的 API 等不兼容。
一种简单的实现方法是在访问片段之前检查用户是否已登录。
在您的 MainActivity 中,您可以在 onNavigationItemSelected 方法中执行类似的操作。
case R.id.nav_profile_side:
if (User_is_logged_in) {
fragmentManager.beginTransaction()
.replace(R.id.content_frame
, new FragmentProfile())
.commit();
}else {
ShowLoginOrRegisterDialog(fragmentManager);
}
break;
但是,如果您使用导航抽屉,抽屉中的选择将更改为 Profile,尽管我们还没有进入 ProfileFragment。
要将选择重置为当前选择,请运行以下代码
navigationView.getMenu().getItem(0).setChecked(true);
可能会很晚。这对我有用。我稍微更新了@Gobar 和@kris Solutions 的代码。我们必须更新 PagerAdapter
中的代码。
每次标签可见并返回其位置时都会调用 setPrimaryItem
。如果位置相同意味着我们不为所动。如果位置改变并且当前位置不是我们点击的标签设置为-1。
private int mCurrentPosition = -1;
@Override
public void setPrimaryItem(@NotNull ViewGroup container, int position, @NotNull Object object) {
// This is what calls setMenuVisibility() on the fragments
super.setPrimaryItem(container, position, object);
if (position == mCurrentPosition) {
return;
}
if (object instanceof YourFragment) {
YourFragment fragment = (YourFragment) object;
if (fragment.isResumed()) {
mCurrentPosition = position;
fragment.doYourWork();//Update your function
}
} else {
mCurrentPosition = -1;
}
}
我覆盖了关联的 FragmentStatePagerAdapter 的 Count 方法,并让它返回总计数减去要隐藏的页数:
public class MyAdapter : Android.Support.V13.App.FragmentStatePagerAdapter
{
private List<Fragment> _fragments;
public int TrimmedPages { get; set; }
public MyAdapter(Android.App.FragmentManager fm) : base(fm) { }
public MyAdapter(Android.App.FragmentManager fm, List<Android.App.Fragment> fragments) : base(fm)
{
_fragments = fragments;
TrimmedPages = 0;
}
public override int Count
{
//get { return _fragments.Count; }
get { return _fragments.Count - TrimmedPages; }
}
}
因此,如果最初将 3 个片段添加到 ViewPager,并且在满足某些条件之前只显示前 2 个片段,则通过将 TrimmedPages 设置为 1 来覆盖页面计数,并且它应该只显示前两个页面。
这对最后的页面很有用,但对开始或中间的页面没有帮助(尽管有很多方法可以做到这一点)。
isResumed()
中以避免NPE。对我来说工作得很好。setUserVisibleHint
现在已弃用