Pregunta

Tengo un ViewPager, cada página es una vista de fragmentos. Quiero probar si un fragmento está en una región visible. el fragmento.

  • El fragmento está unido a una actividad
  • El fragmento está configurado para visible
  • El fragmento se ha agregado a una vista

El ViewPager creará 3 (por defecto) fragmento y los tres cumplirán los criterios anteriores, pero solo uno es realmente visible para el usuario (el humano ojos)

¿Fue útil?

Solución

¡Tienes razón, hay una mejor manera de hacer esto!

Eche un vistazo al FragmentPagerAdapter javadoc en línea y verá que hay un método setPrimaryItem (Container ViewGroup, INT Posición, Objeto Objeto): Void haciendo exactamente lo que necesitas.

Del javadoc

public void setPrimaryItem (ViewGroup Container, INT Position, Object Object)

Llamado para informar al adaptador de qué elemento se considera actualmente el "primario", ese es el que muestra al usuario como la página actual.

Contenedor de parámetros La vista de contenido desde la cual se eliminará la página. Coloque la posición de página que ahora es la primaria. Objeto El mismo objeto que fue devuelto por InstanciateItem (Ver, int).

Nota sobre el estado de desplazamiento

Ahora, si implementa esto y comienza a depurar para tener una idea de cuándo se llama exactamente esto, notará rápidamente que esto se activa varias veces al preparar el fragmento y mientras el usuario avanza.

Por lo tanto, podría ser una buena idea adjuntar también un VISTPAGER.ONPAGECHANGELISTENER y solo haz lo que hay que hacer una vez que los vistas desplazan el estado Scoll_state_idle otra vez.

Otros consejos

Esto es lo que uso para determinar la visibilidad de un fragmento.

private static boolean m_iAmVisible;

@Override
public void setUserVisibleHint(boolean isVisibleToUser) { 
    super.setUserVisibleHint(isVisibleToUser);
    m_iAmVisible = isVisibleToUser;

    if (m_iAmVisible) { 
        Log.d(localTAG, "this fragment is now visible");
    } else {  
        Log.d(localTAG, "this fragment is now invisible");
    }
}

Para mis propósitos, funcionó para usar ViewPager.OnPageChangeListener.onPageSelected() junto con Fragment.onActivityCreated() realizar una acción cuando el fragmento es visible. Fragment.getUserVisibleHint() ayuda también.

Estoy usando el metro de "setmenuvisibility" para resolver este problema. Como todos los fragmentos pueden tener activos barras, esta es la parte donde puede determinar qué fragmento es actualmente visible para el usuario.

@Override
public void setMenuVisibility(final boolean visible) {
    super.setMenuVisibility(visible);
    if (!visible) {
        //not visible anymore
    }else{
        yay visible to the user
    }
}

¿Qué hay de malo en usar getView().isShown() ¿Para saber si un fragmento es realmente visible?

isVisible() 

Todavía puede devolver cierto incluso si el fragmento está detrás de una actividad.

Estoy usando lo siguiente:

if (getView() != null && getView().isShown()) {
//your code here
}

Si sabe a qué "página" se adjunta cada fragmento, puede usar ViewPager.GetCurrentItem () para determinar qué fragmento es "visible".

En mi caso, tengo que trabajar en el primer fragmento cuando el fragmento es visible para el usuario

 @Override
public void onWindowFocusChanged(boolean hasFocus) {
    super.onWindowFocusChanged(hasFocus);


    if(viewPager.getAdapter() instanceof YourPager)
    {
        Fragment fragemnt=((YourPager)viewPager.getAdapter()).getFragment(0); //getFragment(int index) custom method
        if( fragemnt instanceof YourFragment)
        {
            ((YourFragment)fragemnt).methodWhochShouldBeCalledAfterUIVisible();
        }
    }
}

setUserVisibleHint Probablemente no se llame, onHiddenChanged Puede llamarse no cada vez que se cierre otro fragmento. Entonces, puedes confiar en onResume (y onPause), pero generalmente se llama con demasiada frecuencia (por ejemplo, cuando enciende una pantalla de dispositivo). También en algunas situaciones no se llama, debe administrar el fragmento actual en la actividad del host y escribir:

if (currentFragment != null) {
    currentFragment.onResume();
}

Kotlin:

if (userVisibleHint) {
    // the fragment is visible
} else {
    // the fragment is not visible
}

Java

if (getUserVisibleHint()) {
    // the fragment is visible
} else {
    // the fragment is not visible
}

https://developer.android.com/reference/android/app/fragment.html#getUservisibleHint ()

https://stackoverflow.com/a/12523627/2069407

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top