2012-05-07 14 views
5

Tengo una aplicación con un ViewPager que contiene dos fragmentos: un fragmento principal y un fragmento de lista. Si se selecciona algo en la lista, se genera un evento que se maneja en la actividad. La actividad cambia al fragmento principal y llama al método "setSelectedItem". En este método, utilizo getView() para encontrar una vista específica para cambiar el texto de acuerdo con el elemento seleccionado.getView en fragmentos devuelve a veces nulo

La mayoría de las veces funciona, pero a veces getView devuelve nulo y no sé por qué.

El pagerAdapter se crea en OnCreate de la actividad:

this.mPagerAdapter = new PagerAdapter(super.getSupportFragmentManager()); 
ViewPager pager = (ViewPager)super.findViewById(R.id.viewpager); 
pager.setAdapter(this.mPagerAdapter); 

El adaptador localizador crea instancias de ambos fragmentos en su constructor:

public PagerAdapter(FragmentManager fm) { 
    super(fm); 
    this.main = MainFragment.newInstance(); 
    this.list = ListFragment.newInstance(); 
} 

Este es el método en la actividad que se llama cuando se selecciona un elemento de la lista:

ViewPager pager = (ViewPager)super.findViewById(R.id.viewpager); 
pager.setCurrentItem(0, true); 
((MainFragment)mPagerAdapter.getItem(0)).setSelectedItem(id); 

Y finalmente th es la línea está en el método setSelectedItem en el MainFragment que causa el problema:

TextView s = (TextView)getView().findViewById(R.id.CurrentSelection); 

He intentado varias cosas que leí sobre pero el problema se sigue produciendo de forma irregular.

+0

Desafortunadamente tengo el mismo problema y no tengo ninguna resolución. Mi código está lleno de if (getView() == null) return; en varios lugares. Si ya has resuelto el problema, me interesaría. – StackOverflowed

+2

¿Puedes compartir el código donde agregas el fragmento al administrador de fragmentos? Es posible que getView devuelva nulo si onCreateView (parte del ciclo de vida del fragmento) no se ha llamado para el fragmento, es decir, el fragmento no se ha agregado completamente a la actividad. – PacificSky

+0

¿A dónde llamas "TextView s"? ¿Esto es público View getView en el fragmento? –

Respuesta

0

Para empezar, no estoy 100% seguro, pero tengo un par de puntos que debo mencionar. En primer lugar, no me gusta cómo está usando this y super así, parecen ser imprecisos, creo que una mejor manera es ser más preciso teniendo en cuenta la precompilación, usted es consciente de sus valores. Creo que si cambias tu código de la siguiente manera, sería útil (solo una corazonada).

// No need for 'this' and 'super' here, you are within the activity 
mPagerAdapter = new PagerAdapter(getSupportFragmentManager()); 
ViewPager pager = (ViewPager)findViewById(R.id.viewpager); 
pager.setAdapter(mPagerAdapter); 

public PagerAdapter(FragmentManager fm) { 
    super(fm); 
    // No need for 'this' here, you are within the class 
    main = MainFragment.newInstance(); 
    list = ListFragment.newInstance(); 
} 

// No need for 'super' here, you are within the activity 
ViewPager pager = (ViewPager)findViewById(R.id.viewpager); 
pager.setCurrentItem(0, true); 
((MainFragment)mPagerAdapter.getItem(0)).setSelectedItem(id); 

// Here use 'getActivity()' instead of 'getView()' 
TextView s = (TextView)getActivity().findViewById(R.id.CurrentSelection); 

Déjame saber lo que sucede, aplausos.

+0

El tema es bastante viejo y sigue sin ser una respuesta aceptada. Tiene el mismo problema y está buscando una solución. Un aviso importante: el problema es la reproducción cuando Android mata la actividad de alojamiento (en mem, por ejemplo). Android trata de reiniciar la actividad en este caso.Por algún motivo, onCreateView no se llama después de la recreación de fragmentos sino que se llama antes (!). Para reproducir con seguridad el problema, se puede establecer 'destruir cada actividad tan pronto como el usuario lo abandone' en las' opciones de desarrollador'. Luego, pausa el aplicación presionando el botón de inicio y restaurarlo. – undefined

Cuestiones relacionadas