【问题标题】:ViewPager call setUserVisibleHint after first Fragment is loaded加载第一个 Fragment 后 ViewPager 调用 setUserVisibleHint
【发布时间】:2014-09-04 14:09:14
【问题描述】:

在我的应用程序中,我有一个 ViewPager,其中包含许多带有片段的可滑动标签。我使用setUserVisibleHint 方法来检测Fragment 何时出现在屏幕上。当用户在选项卡之间滑动但在第一次加载时不起作用时,这非常有用。要在该方法中运行代码,我必须向左滑动然后返回到第一个 Fragment,因为在 onCreateView 方法之前调用了 setUserVisibleHint 方法。

您知道如何在第一个 Fragment 可见后运行此代码吗? ViewPager 里面有没有方法或者别的什么?

【问题讨论】:

  • 当我尝试做类似的事情(检测 viewpager 中的哪些片段是当前可见页面)时,我遇到了完全相同的问题。我尝试的每一个解决方案都是一个 hack,而且从来都不是完全正确的。

标签: android android-fragments android-viewpager


【解决方案1】:

您不能(也不应该)为此依赖 setUserVisibleHint。相反,您应该使用ViewPager.OnPageChangeListener 来获取页面何时可见的回调。例如

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
    } 
});

【讨论】:

  • 如果您想在片段更改时重新创建操作栏菜单,您应该像@paul 说的那样在 onpagechangelistener 上实现它。
  • 谢谢。有时 onCreateView 和 setUserVisibleHint 会被其他人调用...此方法确保在两者都被调用后。
  • Paul : 我怎样才能在第一页第一次使用它?
  • 使用addOnPageChangeListener 而不是setOnPageChangeListener stackoverflow.com/a/30867886/1815624
  • 同意这对于加载的第一页根本不起作用
【解决方案2】:

以下为我工作

请创建一个像这样的全局视图

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
   }

【讨论】:

  • 为什么要投反对票??如果有人发现它有任何问题,请告诉我
  • 可能是因为使用了全局变量?
  • @Jose_GD 全局变量有什么问题??
【解决方案3】:

您必须在根活动/片段中手动调用mViewPagerListener.onPageSelected(0); 中的onCreateView

【讨论】:

    【解决方案4】:

    我不明白你到底需要什么,但你可以通过调用返回整数的ViewPager.getCurrentItem 来检测当前片段的页面。

    希望对你有帮助。

    祝你好运。

    【讨论】:

      【解决方案5】:

      好吧,它的解决方法更多,也许设置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;
      

      也许有人会觉得它有用。这对我有用。

      【讨论】:

        【解决方案6】:

        我检查了你的问题,但我发现onCreateView方法在 setUserVisibleHint方法

        enter code here
        

        因为 setUserVisibleHint 方法是在 onCreateView 方法之前调用的

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-09-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-05-07
          • 1970-01-01
          相关资源
          最近更新 更多