Solución 1:
definir un SparseArray
en sus ViewPagers
'adaptadores, como a continuación. En este conjunto, mantendremos la instancia de fragmentos.
SparseArray<Fragment> registeredFragments = new SparseArray<>();
Y Override
instantiateItem
método de sus adaptadores.
@Override
public Object instantiateItem(ViewGroup container, int position) {
Fragment fragment = (Fragment) super.instantiateItem(container, position);
registeredFragments.put(position, fragment);
return fragment;
}
también Override
destroyItem
método de su ViewPagers
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
registeredFragments.remove(position);
super.destroyItem(container, position, object);
}
y definir un nuevo método para obtener la instancia de ViewPager
Fragments
.
public Fragment getRegisteredFragment(int position) {
return registeredFragments.get(position);
}
Ahora puede implementar su lógica con ViewPager's
OnPageChangeListener
. He aquí un ejemplo de cómo se puede implementar de una ViewPager onPageChangeListener
:
Definir un entero para mantener la posición actual:
int currentPos;
yourViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
// Empty method
}
@Override
public void onPageSelected(int position) {
// This is paused fragment.
final Fragment pausedFragment = yourAdapter.getRegisteredFragment(currentPos);
// update current position value
currentPos = position;
// This is resumed fragment
final Fragment resumedFragment = yourAdapter.getRegisteredFragment(currentPos);
}
@Override
public void onPageScrollStateChanged(int state) {
// Empty method
}
});
Finalmente, para la restauración de estado de la instancia actualizar su posición actual a mantenerse al día en el que el usuario posición a la izquierda ViewPager
currentPos = yourViewPager.getCurrentItem();
Solución 2:
Para otra solución puede encontrar su ViewPager
Fragments
por Tag
. Puede generar su etiqueta con:
@NonNull
public static String generateViewPagerFragmentTag(int viewPagerId, int position) {
final StringBuilder tagBuilder = new StringBuilder();
tagBuilder.append("android:switcher:");
tagBuilder.append(viewPagerId);
tagBuilder.append(":");
tagBuilder.append(position);
return tagBuilder.toString();
}
y encontrar su Fragment
:
final Fragment yourFragment = getSupportFragmentManager().findFragmentByTag(generateViewPagerFragmentTag(R.id.your_viewpager, currentPos));
Edición: hace unos años, mientras que yo estaba buscando una solución para conseguir elemento actual de ViewPager he intentado UserVisibleHint
en Fragments
y notó que no era confiable. No estoy seguro de si es confiable o no ahora, pero aún así evito usarlo.
podría darle un poco más de información? – Darkhogg
Supongo que durante la devolución de llamada OnPageChange(), puede establecer el UserVisiblityHint en true en el nuevo fragmento seleccionado y en false en el fragmento anterior. Luego llamando a sus respectivos métodos on Resume() y onPause(). La sugerencia de visibilidad del usuario debe registrarse en Repetición() para garantizar que la llamada se realiza durante el Cambio de página en lugar del estándar durante la creación del fragmento. ¿Existe una bandera real para recuperar el comportamiento documentado? – 3c71
Lo siento amigo, he estado fuera de la ciudad. Me alegro de que alguien haya venido! – Phix