804

问题:onResume()ViewPager片段真正可见之前触发片段。

例如,我有 2 个带有ViewPager和的片段FragmentPagerAdapter。第二个片段仅适用于授权用户,我需要在片段可见时要求用户登录(使用警报对话框)。

但是ViewPager当第一个片段可见时创建第二个片段,以便缓存第二个片段并在用户开始滑动时使其可见。

所以onResume()事件在第二个片段变得可见之前很久就在第二个片段中被触发。这就是为什么我试图找到一个在第二个片段变得可见时触发的事件以在适当的时刻显示一个对话框。

如何才能做到这一点?

4

26 回答 26

604

如何确定 Fragment 何时在 ViewPager 中可见

setUserVisibleHint您可以通过覆盖来执行以下操作Fragment

public class MyFragment extends Fragment {
    @Override
    public void setUserVisibleHint(boolean isVisibleToUser) {
        super.setUserVisibleHint(isVisibleToUser);
        if (isVisibleToUser) {
        }
        else {
        }
    }
}
于 2012-06-17T23:42:09.847 回答
531

更新:Android 支持库(第 11 版)最终修复了用户可见提示问题,现在如果您将支持库用于片段,那么您可以安全地使用getUserVisibleHint()或覆盖setUserVisibleHint()以捕获 Gorn 回答中描述的更改。

更新 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一次只显示一页,但如果您使用FragmentStatePagerAdapterin ,预缓存的片段也会置于“可见”状态(实际上是不可见) Android Support Library pre-r11

我覆盖:

public class MyFragment extends Fragment {
    @Override
    public void setMenuVisibility(final boolean visible) {
        super.setMenuVisibility(visible);
        if (visible) {
            // ...
        }
    }
   // ...
}

捕获片段的焦点状态,我认为这是您所说的“可见性”最合适的状态,因为 ViewPager 中只有一个片段实际上可以将其菜单项与父活动的项放在一起。

于 2012-09-21T02:56:33.283 回答
147

这似乎恢复了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
}
于 2014-08-03T03:02:12.820 回答
74

这是另一种使用方式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

  }
});
于 2012-08-03T14:41:51.913 回答
58

setUserVisibleHint()有时会在之前 被调用onCreateView(),有时会在之后被调用,这会导致麻烦。

为了克服这个问题,您还需要检查isResumed()内部setUserVisibleHint()方法。但在这种情况下,我意识到只有在 Fragment 恢复且可见时setUserVisibleHint()才会调用,而不是在创建时调用。

因此,如果您想在 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()调用。然后,当您滑动到第二个选项卡时,会调用myUIUpdate()from if (visible && isResumed()),因此myUIUpdate()可能会在一秒钟内调用两次。

另一个问题!visiblesetUserVisibleHint1) 当你离开片段屏幕时和 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: 确保仅在片段创建且可见时调用 in,而不是在恢复时调用myUIUpdate()onCreateView()它还解决了您在第一个选项卡时的问题,即使第二个选项卡不可见也会创建。这解决了这个问题并检查片段屏幕是否在onCreate.

fragmentOnCreated:确保片段不可见,并且在您第一次创建片段时不被调用。所以现在这个 if 子句只有在你滑出片段时才会被调用。

更新 您可以将所有这些代码放在这样的代码中BaseFragment覆盖方法。

于 2015-04-14T07:27:17.327 回答
49

在版本中ViewPager2ViewPager版本androidx.fragment:fragment:1.1.0中,您可以只使用onPauseonResume回调来确定当前对用户可见的片段。当片段变得可见并且停止可见时onResume调用回调。onPause

在 ViewPager2 的情况下,它是默认行为,但可以ViewPager轻松地为旧物品启用相同的行为。

要在第一个 ViewPager 中启用此行为,您必须将FragmentPagerAdapter.BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT参数作为FragmentPagerAdapter构造函数的第二个参数传递。

FragmentPagerAdapter(fragmentManager, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT)

注意:带有一个参数的 setUserVisibleHint()方法和构造函数现在在新版本的来自 android jetpack 的 Fragment 中已弃用。FragmentPagerAdapter

于 2019-09-11T11:44:55.020 回答
34

新的

ViewPager2++ (在Fragment中FragmentStateAdapteronResume()解决问题

旧答案(已弃用)

Fragment为了检测ViewPager可见,我很确定仅使用 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

演示项目在这里

希望有帮助

于 2017-02-03T08:34:14.953 回答
26
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);
    }
}
于 2016-01-06T13:54:44.007 回答
18

setPrimaryItem()在子类中覆盖FragmentPagerAdapter。我用这个方法,效果很好。

@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();
    }
}
于 2015-06-19T18:34:21.477 回答
14

为此覆盖Fragment.onHiddenChanged()

public void onHiddenChanged(boolean hidden)

isHidden()当片段的隐藏状态(由 返回)改变时调用。片段开始时没有隐藏;每当片段改变状态时,都会调用它。

参数
hidden- boolean:如果片段现在隐藏,则为真,如果不可见,则为假。

于 2012-09-09T12:04:16.910 回答
8

只有这对我有用!现在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();
    }
}

经过测试和使用NaviagationDrawerisMenuVisible()总会有回报trueonResume()看起来足够了,但我们也想支持ViewPager)。

setUserVisibleHint已弃用。如果重写此方法,则传入时实现的行为true应移至Fragment.onResume(),传入时实现的行为false应移至Fragment.onPause()

于 2020-07-28T06:13:43.057 回答
5

我发现只有在片段真正可见onCreateOptionsMenu的情况下才调用方法。我找不到任何类似这些行为的方法,我也尝试过,但它不适用于这种情况,例如,我需要在方法中初始化一个变量。onPrepareOptionsMenuOnPageChangeListeneronCreate

所以这两种方法可以作为一种解决方法来解决这个问题,特别是对于小而短的工作。

我认为,这是更好的解决方案,但不是最好的。我将使用它,但同时等待更好的解决方案。

问候。

于 2014-06-24T08:20:46.777 回答
5

setUserVisibleHint(boolean visible)现在已弃用所以这是正确的解决方案

FragmentPagerAdapter(fragmentManager, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT)

在版本中的ViewPager2ViewPagerandroidx.fragment:fragment:1.1.0中,您可以使用onPause()onResume()确定当前对用户可见的片段。onResume()当片段变得可见并且onPause停止可见时调用。

要在第一个 ViewPager 中启用此行为,您必须将FragmentPagerAdapter.BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT参数作为FragmentPagerAdapter构造函数的第二个参数传递。

于 2020-06-06T10:06:01.020 回答
2

此处发布的另一个解决方案覆盖了 kris larson 的 pageradapter 中的 setPrimaryItem几乎对我有用。但是每个设置都会多次调用此方法。我还从片段中的视图等中获得了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();
        }
    }
}
于 2016-04-06T12:57:46.497 回答
2

我们有一个 MVP 的特殊情况,即 Fragment 需要通知 Presenter 视图已经可见,并且 Presenter 是由 Dagger 注入的fragment.onAttach()

setUserVisibleHint()还不够,我们检测到需要解决的 3 种不同情况(onAttach()提及是为了让您知道演示者何时有空):

  1. 刚刚创建了片段。系统进行以下调用:

    setUserVisibleHint() // before fragment's lifecycle calls, so presenter is null
    onAttach()
    ...
    onResume()
    
  2. 已创建片段并按下主页按钮。将应用程序恢复到前台时,这称为:

    onResume()
    
  3. 方向变化:

    onAttach() // presenter available
    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);
}
于 2017-05-08T15:30:26.363 回答
2

通过检测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();
}
于 2017-12-16T11:43:00.323 回答
2

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

}
于 2016-11-11T19:37:46.453 回答
2

在片段内添加以下代码

@Override
public void setMenuVisibility(final boolean visible) 
 {
    super.setMenuVisibility(visible);
    if (visible && isResumed()) 
     {

     }
}
于 2017-01-02T18:24:31.593 回答
1

我遇到过同样的问题。ViewPager执行其他片段生命周期事件,我无法更改该行为。我使用片段和可用动画编写了一个简单的寻呼机。 简单寻呼机

于 2014-03-11T18:35:48.193 回答
1

我用了这个,它奏效了!

mContext.getWindow().getDecorView().isShown() //boolean
于 2018-09-21T10:57:28.917 回答
1

我支持带有子片段的 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;
    }
}
于 2019-05-09T09:56:27.537 回答
0

当我试图让计时器在视图页面中的片段在屏幕上供用户查看时触发时,我遇到了这个问题。

计时器总是在用户看到片段之前启动。这是因为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 等不兼容。

于 2015-08-05T14:12:26.417 回答
0

可能会很晚。这对我有用。我稍微更新了@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;
    }
}
于 2020-09-24T06:46:26.653 回答
0

请注意,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
    }
}
于 2015-12-09T19:53:47.207 回答
0

一种简单的实现方法是在访问片段之前检查用户是否已登录。

在您的 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);
于 2019-05-28T17:35:03.357 回答
-4

我覆盖了关联的 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 来覆盖页面计数,并且它应该只显示前两个页面。

这对最后的页面很有用,但对开始或中间的页面没有帮助(尽管有很多方法可以做到这一点)。

于 2013-01-11T21:28:09.303 回答