我在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
。
提前致谢。
答案 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();
}
希望这会对你有所帮助。