Reputation: 864
I am building an App in which multiple fragments are shown at once using ViewPager and FragmentStatePagerAdapter. Below is what I am doing:
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;
}
}
}
}
My Question is how to find which fragments are visible?? (eg Fragment 1, 2 and 3 from screen shot)
I know abot pager.setOnPageChangeListener and Fragment.setUserVisibleHint(boolean isVisibleToUser) but of no use to me :-(
Your help is very appreciated. Thanks!!!
Upvotes: 1
Views: 3665
Reputation: 1376
I do:
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;
}
}
}
Upvotes: 0
Reputation: 1655
this link might be helpful
use this line of code
Fragment fr = getSupportFragmentManager().findFragmentByTag(“android:switcher:” + R.id.pager + “:” + mViewPager.getCurrentItem());
Upvotes: 2
Reputation: 5119
Look at this two working Solutions
Also look at this
Since your storing your fragment in the private List<Fragment> fragments;
you could let the Fragments
tell you about each Fragment visibility state. In the Fragment
, After the onStart()
is called the Fragment is visible to the user. Just iterate all fragment in your List
and ask them using a boolean
visible/notVisible
Upvotes: 0
Reputation: 1911
This could be a possible solution
Hint
Using that position check the fragments visibility on either side of the adapter.
Example: ie current position is 3 and you are displaying 3 fragment at a time then check fragments in position 2,1 and 4,5 for there visibility using the method getUserVisibleHint().
store the positions of the fragment which is visible and return it in an array
Hope this helps
Upvotes: 0