Make accessing fragments inside a view pager more robust
This commit is contained in:
parent
1cf701a422
commit
ae9c22b20e
|
@ -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
|
@Override
|
||||||
public boolean onBackPressed() {
|
public boolean onBackPressed() {
|
||||||
// Tell current fragment to move up one directory, if possible
|
// 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()) {
|
if ((curPage != null) && !curPage.atRootDirectory()) {
|
||||||
curPage.onBackPressed();
|
curPage.onBackPressed();
|
||||||
return true;
|
return true;
|
||||||
|
|
|
@ -78,15 +78,12 @@ public class PVRListFragment extends Fragment
|
||||||
setHasOptionsMenu(false);
|
setHasOptionsMenu(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
Fragment findFragmentByPosition(int position) {
|
|
||||||
String tag = "android:switcher:" + viewPager.getId() + ":" + position;
|
|
||||||
return getChildFragmentManager().findFragmentByTag(tag);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean onBackPressed() {
|
public boolean onBackPressed() {
|
||||||
// Tell current fragment to move up one directory, if possible
|
// 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) {
|
if (visibleFragment instanceof OnBackPressedListener) {
|
||||||
return ((OnBackPressedListener) visibleFragment).onBackPressed();
|
return ((OnBackPressedListener) visibleFragment).onBackPressed();
|
||||||
}
|
}
|
||||||
|
|
|
@ -20,8 +20,10 @@ import android.os.Bundle;
|
||||||
import android.support.v4.app.Fragment;
|
import android.support.v4.app.Fragment;
|
||||||
import android.support.v4.app.FragmentManager;
|
import android.support.v4.app.FragmentManager;
|
||||||
import android.support.v4.app.FragmentPagerAdapter;
|
import android.support.v4.app.FragmentPagerAdapter;
|
||||||
|
import android.view.ViewGroup;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
import java.util.HashMap;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This is a helper class that implements the management of tabs and all
|
* 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();
|
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
|
@Override
|
||||||
public Fragment getItem(int position) {
|
public Fragment getItem(int position) {
|
||||||
TabInfo info = tabInfos.get(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
|
@Override
|
||||||
public long getItemId(int position) {
|
public long getItemId(int position) {
|
||||||
return tabInfos.get(position).fragmentId;
|
return tabInfos.get(position).fragmentId;
|
||||||
|
|
Loading…
Reference in New Issue