【问题标题】:How to find currently visible fragments in a viewpager while showing multiple fragments at once如何在一次显示多个片段的同时在查看器中查找当前可见的片段
【发布时间】:2014-04-02 11:25:04
【问题描述】:

我正在构建一个应用程序,其中使用 ViewPager 和 FragmentStatePagerAdapter 一次显示多个片段。以下是我正在做的事情:

public class PageViewActivity extends FragmentActivity {
    protected static final String TAG = "PageViewActivity";
    MyPageAdapter pageAdapter;
    private List<Fragment> fragments;
    private FragmentManager fragmentManager;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_page_view);

        fragments = getFragments();

        fragmentManager = getSupportFragmentManager();

        pageAdapter = new MyPageAdapter(fragmentManager, fragments);

        ViewPager pager = (ViewPager) findViewById(R.id.viewpager);
        pager.setAdapter(pageAdapter);
        pager.setOnPageChangeListener(new OnPageChangeListener() {

            @Override
            public void onPageSelected(int position) {
                Log.i(TAG, "Inside onPageSelected....................... "
                        + position);
                ((MyFragment) pageAdapter.getChildAt(position)).updateView();
            }

            @Override
            public void onPageScrolled(int arg0, float arg1, int arg2) {
                Log.i(TAG, "Inside onPageScrolled... " + arg0);
            }

            @Override
            public void onPageScrollStateChanged(int arg0) {
                Log.i(TAG, "Inside onPageScrollStateChanged... " + arg0);
            }
        });
    }

    private List<Fragment> getFragments() {
        List<Fragment> fList = new ArrayList<Fragment>();

        fList.add(MyFragment.newInstance("Fragment 1"));
        fList.add(MyFragment.newInstance("Fragment 2"));
        fList.add(MyFragment.newInstance("Fragment 3"));
        fList.add(MyFragment.newInstance("Fragment 4"));
        fList.add(MyFragment.newInstance("Fragment 5"));
        fList.add(MyFragment.newInstance("Fragment 6"));
        fList.add(MyFragment.newInstance("Fragment 7"));

        return fList;
    }

    private class MyPageAdapter extends FragmentStatePagerAdapter {
        private List<Fragment> fragments;

        public MyPageAdapter(FragmentManager fm, List<Fragment> fragments) {
            super(fm);
            this.fragments = fragments;
        }

        public void setList(List<Fragment> fragments) {
            this.fragments = fragments;
            notifyDataSetChanged();
        }

        @Override
        public Fragment getItem(int position) {
            Log.i(TAG, "Inside getItem............");
            return this.fragments.get(position);
        }

        @Override
        public int getCount() {
            return this.fragments.size();
        }

        @Override
        public float getPageWidth(int position) {
            if (position == 0) {
                return 0.4f;
            } else {
                return 0.3f;
            }
        }

        public Fragment getChildAt(int position) {
            return this.fragments.get(position);
        }

        @Override
        public int getItemPosition(Object object) {
            Log.i(TAG, "getItemPosition..........");
            if (fragments.contains(object)) {
                Log.i(TAG,
                        "fragmentList.contains(object)... " + object.toString());
                return POSITION_UNCHANGED;
            }
            return POSITION_NONE;
        }

                    }
    }
}

我的问题是如何找到哪些片段可见?(例如屏幕截图中的片段 1、2 和 3)

我知道 pager.setOnPageChangeListenerFragment.setUserVisibleHint(boolean isVisibleToUser) 但对我没用 :-(

非常感谢您的帮助。谢谢!!!

【问题讨论】:

    标签: android android-fragments android-viewpager android-fragmentactivity fragmentstatepageradapter


    【解决方案1】:

    这个link 可能会有所帮助

    使用这行代码 Fragment fr = getSupportFragmentManager().findFragmentByTag(“android:switcher:” + R.id.pager + “:” + mViewPager.getCurrentItem());

    【讨论】:

      【解决方案2】:

      这可能是一个可能的解决方案

      提示

      1. 在您的适配器中编写一个接受整数的函数(即 getCurrentItem 选择的适配器函数输出)。
      2. 使用该位置检查适配器两侧的片段可见性。

        示例: 即当前位置为 3,您一次显示 3 个片段,然后使用 getUserVisibleHint() 方法检查位置 2,1 和 4,5 中的片段是否可见。

      3. 存储可见片段的位置并以数组形式返回

      希望对你有帮助

      【讨论】:

      • 应该在适配器中写哪个函数?请多解释一下。
      • 任何自定义函数名称示例 getVisibleFragmentsPosition
      【解决方案3】:

      看看这两个工作的Solutions

      也看this

      由于您将片段存储在private List&lt;Fragment&gt; fragments; 中,因此您可以让Fragments 告诉您每个片段的可见性状态。在Fragment 中,调用onStart() 之后,Fragment 对用户可见。只需迭代 List 中的所有片段并使用 boolean visible/notVisible 询问他们

      【讨论】:

      • 它将返回一个索引而不是所有可见的片段索引。 int index = mViewPager.getCurrentItem();
      • 是的,你是对的,我用另一个可能的修复方法更新了我的问题
      • 感谢您的关注,但一旦启动活动,所有片段(在我的情况下为 7 个片段)的 onStart() 方法就会被调用。同样 setUserVisibleHint() 仅对最左边的片段返回 true。所以它没有帮助。还有什么办法吗?
      【解决方案4】:

      我愿意:

       for (Fragment frag : getSupportFragmentManager().getFragments()) {
                      if (frag instanceof LogbookFragment) {
                          LogbookFragment logFrag = (LogbookFragment) frag;
                          if (logFrag.getUserVisibleHint()) {
                              createDocument(logFrag.data.Trips, sp_swipeType.getSelectedItemPosition(), logFrag._dtStart);
                              break;
                          }
                      }
                  }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-08-04
        • 1970-01-01
        • 2017-06-12
        • 2016-07-22
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多