Make accessing fragments inside a view pager more robust

This commit is contained in:
Synced Synapse 2015-11-28 18:30:29 +00:00
parent 1cf701a422
commit ae9c22b20e
3 changed files with 25 additions and 13 deletions

View File

@ -77,15 +77,11 @@ public class FileListFragment extends Fragment
}
}
MediaFileListFragment findFragmentByPosition(int position) {
String tag = "android:switcher:" + viewPager.getId() + ":" + position;
return (MediaFileListFragment) getChildFragmentManager().findFragmentByTag(tag);
}
@Override
public boolean onBackPressed() {
// Tell current fragment to move up one directory, if possible
MediaFileListFragment curPage = findFragmentByPosition(viewPager.getCurrentItem() + 1);
MediaFileListFragment curPage = (MediaFileListFragment)((TabsAdapter)viewPager.getAdapter())
.getStoredFragment(viewPager.getCurrentItem());
if ((curPage != null) && !curPage.atRootDirectory()) {
curPage.onBackPressed();
return true;

View File

@ -78,15 +78,12 @@ public class PVRListFragment extends Fragment
setHasOptionsMenu(false);
}
Fragment findFragmentByPosition(int position) {
String tag = "android:switcher:" + viewPager.getId() + ":" + position;
return getChildFragmentManager().findFragmentByTag(tag);
}
@Override
public boolean onBackPressed() {
// Tell current fragment to move up one directory, if possible
Fragment visibleFragment = findFragmentByPosition(viewPager.getCurrentItem() + 1);
Fragment visibleFragment = ((TabsAdapter)viewPager.getAdapter())
.getStoredFragment(viewPager.getCurrentItem());
if (visibleFragment instanceof OnBackPressedListener) {
return ((OnBackPressedListener) visibleFragment).onBackPressed();
}

View File

@ -20,8 +20,10 @@ import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import android.view.ViewGroup;
import java.util.ArrayList;
import java.util.HashMap;
/**
* This is a helper class that implements the management of tabs and all
@ -62,12 +64,29 @@ public class TabsAdapter extends FragmentPagerAdapter {
return tabInfos.size();
}
/**
* Store the created fragments, so that it is possible to get them by position later
*/
private HashMap<Integer, Fragment> createdFragments = new HashMap<>(5);
@Override
public Fragment getItem(int position) {
TabInfo info = tabInfos.get(position);
return Fragment.instantiate(context, info.fragmentClass.getName(), info.args);
Fragment fragment = Fragment.instantiate(context, info.fragmentClass.getName(), info.args);
createdFragments.put(position, fragment);
return fragment;
}
@Override
public void destroyItem (ViewGroup container, int position, Object object) {
super.destroyItem(container, position, object);
createdFragments.remove(position);
}
public Fragment getStoredFragment(int position) {
return createdFragments.get(position);
}
@Override
public long getItemId(int position) {
return tabInfos.get(position).fragmentId;