如何确保ViewPager

时间:2017-08-17 03:21:19

标签: android android-fragments android-viewpager

我在Fragments内有3个ViewPager。我想仅在Fragment 可见给用户时才执行网络通话。目前我使用以下方法:

@Override
    public void setMenuVisibility(boolean menuVisible) {
        super.setMenuVisibility(menuVisible);
        if (menuVisible) {
            isVisible = true;

        } else {
            isVisible = false;

        }

    }

但上述方法的问题是在第一个getActivity()中给了我Fragment null 。此方法在第2和第3 Fragment中正常工作。 我尝试使用setUserVisibleHint(),但每次都返回true。 什么可以成为上述问题的防弹解决方案?我想要一种方法,可以告诉我Fragment 是否可见给用户以及getActivity()!=null

提前致谢。

3 个答案:

答案 0 :(得分:1)

我面对同样的情况最后我使用了这种方法...

这是我的ViewPagerAdapter类

public class MenuViewPagerAdapter extends FragmentStatePagerAdapter {


    private ArrayList<CategoryObject> arrayCategory;
    private SparseArray<Fragment> mPageReferenceMap = new SparseArray<Fragment>();
    private Context context;


    public MenuViewPagerAdapter(FragmentManager fm, RealmList<CategoryObject> arrayCategory,Context context) {
        super(fm);
        this.arrayCategory = arrayCategory;
        this.context = context;
    }

    @Override
    public Fragment getItem(int position) {
        Fragment fragment;
        fragment = FragmentMenuList.newInstance();
        mPageReferenceMap.put(position, fragment);
        return fragment;
    }

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


    public Fragment getCurrentItem(int position) {
        return mPageReferenceMap.get(position);
    }
}

下面的方法将从SparseArray返回当前活动片段

public Fragment getCurrentItem(int position) {
            return mPageReferenceMap.get(position);
        }

要调用该方法,您可以使用以下方式...

MainActivity.Java类

public class MainActivity extends BaseActivity implements View.OnClickListener{
  private ViewPager viewPager;
  private ImageView imageNextCategory;

  @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    MenuViewPagerAdapter menuViewPagerAdapter = new MenuViewPagerAdapter(getFragmentManager(), arrayCategory getActivity());
   viewPager = (ViewPager) findViewById(R.id.viewPager);
   imageNextCategory=(ImageView)findViewById(R.id.imageNextCategory);
   viewPager.setAdapter(menuViewPagerAdapter);
imageNextCategory.setOnClickListener(this);
    }

 @Override
    public void onClick(View view) {
        switch (view.getId()) {
          case R.id.imageNextCategory:
Fragment fragment=menuViewPagerAdapter.getCurrentItem(viewPager.getCurrentItem());
if(fragment!=null){

  //isVisible() used to check if fragment is visible now
  if((YourFragment)fragment).isVisible()){
  //Here you can access any public method of your fragment
  ((YourFragment)fragment).accessMethod();
 }
}
break;
    }
  }

}

希望这会对你有所帮助..如果有任何疑问请告诉我......这种方法是由我自己测试的。它工作得很完美......还有其他任何解决方案,但这对我有用......一旦你的任务完成了碎片,你就可以清除SparseArray。

答案 1 :(得分:1)

在尝试setUserVisibleHint()时,当您对所有3个片段使用相同的类时,您将根据它将调用setUserVisibleHint()的位置被调用3次或2次,但是在那个中时间将是真实的,剩余时间将是假的,因为目前,一个片段将是可见的。

在那种情况下,不要只检查true或false,只需检查带有一些Id的true(确保它的空指针检查,例如,如果你从第二个位置移动到第三个,那么我们通过{{发送的第一个位置参数1}}将为null)。

实施例: 我在setArguments中有一个用于3片段的片段类,我想在用户聚焦到片段时为某些ViewPager设置动画。

View

答案 2 :(得分:1)

我认为你应该尝试这种完美方式: -

(1) MainActivity(活动)类中添加以下方法:

mViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
        @Override
        public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
        }

        @Override
        public void onPageSelected(int position) {
            int tabPos = MainActivity.mViewPager.getCurrentItem();
            if(tabPos == 1) {
                FirstFragment firstFragment = (FirstFragment) mViewPager.getAdapter().instantiateItem(mViewPager,1);
                firstFragment.refreshOnTabChanged();
            }
            else if(tabPos == 2) {
                SecondFragment secondFragment = (SecondFragment) mViewPager.getAdapter().instantiateItem(mViewPager,2);
                secondFragment.refreshOnTabChanged();
            }
//              Toast.makeText(context, String.valueOf(MainActivity.mViewPager.getCurrentItem()), Toast.LENGTH_SHORT).show();
            }

            @Override
            public void onPageScrollStateChanged(int state) {}
        });

在片段中添加以下方法: -

public void refreshOnTabChanged() {
// Write code for network call
    mTypeVolleyService();
}

如果您有'tabLayout。

,请尝试以下解决方案

MainActivity(活动)类中,在onCreate()方法中添加以下方法: -

tabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
        @Override
        public void onTabSelected(TabLayout.Tab tab) {
            int tabPos = tab.getPosition();
            mViewPager.setCurrentItem(tabPos);

            if(tabPos == 1) {
                FirstFragment firstFragment = (FirstFragment) mViewPager.getAdapter().instantiateItem(mViewPager,1);
                firstFragment.refreshOnTabChanged();
            }
            else if(tabPos == 2) {
                SecondFragment secondFragment = (SecondFragment) mViewPager.getAdapter().instantiateItem(mViewPager,2);
                secondFragment.refreshOnTabChanged();
            }
//              Toast.makeText(context, ""+tabPos, Toast.LENGTH_SHORT).show();
            }

            @Override
            public void onTabUnselected(TabLayout.Tab tab) {
            }

            @Override
            public void onTabReselected(TabLayout.Tab tab) {
                mViewPager.setCurrentItem(tab.getPosition());
            }
        });

在片段中添加以下方法: -

public void refreshOnTabChanged() {
// Write code for network call
    mTypeVolleyService();
}

希望这会对你有所帮助。