Obtener Fragmento por etiqueta

Estoy utilizando un FragmentPagerAdapter para crear una interfaz de usuario de varias páginas con diferentes fragmentos. Lo que quiero hacer es encontrar el Fragmento usando la posición del Fragmento.

He aplicado el método de encontrar el nametag de los fragmentos y utilizar .FindFragmentbyTag () pero el .FindFragmentbyTag siempre me devuelve el valor nulo. La estructura parece ser correcta, así que no estoy seguro de por qué obtener valores nulos, por favor, mirar a través y ayuda es apreciada.

Aquí está el código

MainActivity.java public void onCreate(Bundle savedInstanceState) { this.getSupportFragmentManager(); super.onCreate(savedInstanceState); setContentView(R.layout.main); MainActivity.instance=this; //Initialize pager vpPager = (ViewPager)findViewById(R.id.mypager); pagerAdapter = new MyPagerAdapter(getSupportFragmentManager()); vpPager.setAdapter(pagerAdapter); this.mapFragment = (MapFragment)this.findFragmentByPosition(0); this.drFragment = (DRFragment)this.findFragmentByPosition(1); this.sensorFragment = (SensorFragment)this.findFragmentByPosition(2); ...... } protected Fragment findFragmentByPosition(int position) { int pagerid = this.vpPager.getId(); long pagerAdapterid = this.pagerAdapter.getItemId(position); return getSupportFragmentManager().findFragmentByTag("android:switcher:" + pagerid + ":" + pagerAdapterid + ""); } 

 MyPagerAdapter.java import android.os.Parcelable; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentManager; import android.support.v4.app.FragmentPagerAdapter; import android.view.View; public class MyPagerAdapter extends FragmentPagerAdapter { private static final String TAG = "TM_PageAdapter"; private static int numItems = 3; public MyPagerAdapter(FragmentManager fragmentManager){ super(fragmentManager); } public int getCount() { return numItems; } @Override public Fragment getItem(int position) { switch(position){ case 0: return MapFragment.newInstance(0, "Map Information"); case 1: return DRFragment.newInstance(1, "DR Information"); case 2: return SensorFragment.newInstance(2, "Sensor Information"); default: return null; } } @Override public CharSequence getPageTitle(int position) { switch(position){ case 0: return "Map Information"; case 1: return "DR Information"; case 2: return "Sensor Information"; default: return null; } } public static String makeFragmentName(int viewId, int index) { return "android:switcher:" + viewId + ":" + index; } @Override public boolean isViewFromObject(View arg0, Object arg1) { return arg0 == ((View) arg1); } @Override public Parcelable saveState() { return null; } 

Aquí está uno del código de la .newInstance:

 public static MapFragment newInstance(int position, String title){ MapFragment mapFragment = new MapFragment(); Bundle args = new Bundle(); args.putInt("current_page", 0); args.putString("page_tile", "Map Information"); mapFragment.setArguments(args); return mapFragment; } 

En findFragmentByPosition, no está utilizando el índice, al buscar el fragmento:

 getSupportFragmentManager().findFragmentByTag("android:switcher:" + pagerid + ":" + pagerAdapterid + ""); 

El segundo debe ser el índice, no el pagerAdapterId. Así que el código correcto sería:

 getSupportFragmentManager().findFragmentByTag("android:switcher:" + pagerid + ":" + position); 

Tampoco es necesario concatenar la última cadena vacía.

Utilicé este enfoque en el pasado y funcionó bastante bien.

En su adaptador puede declarar una variable de instancia como sigue:

 private Map<Integer, Fragment> mPageReferenceMap = new HashMap<Integer, Fragment>(); 

En su getItem () poner una referencia del fragmento en el mapa

 mPageReferenceMap.put(position, f); 

Anule el método InstantiateItem:

 /** * After an orientation change, the fragments are saved in the adapter, and * I don't want to double save them: I will retrieve them and put them in my * list again here. */ @Override public Object instantiateItem(ViewGroup container, int position) { Fragment fragment = (Fragment) super.instantiateItem(container, position); mPageReferenceMap.put(position, fragment); return fragment; } 

Anule el onDestroyItem para limpiar las referencias:

 @Override public void destroyItem(ViewGroup container, int position, Object object) { super.destroyItem(container, position, object); mPageReferenceMap.remove(position); } 

Y finalmente conseguir el fragmento dependiendo de su posición:

 public Fragment getFragment(int key) { return mPageReferenceMap.get(key); } 

Espero eso ayude.

Parece que lo que hizo que mi referencia fuera a null es porque Loading fragments se hace en segundo plano y cuando hago referencia a esos fragmentos la carga aún no está completa (gracias Daniel Zolnai por poiting eso, te daría respuesta correcta tick si u lo puso como una respuesta) Mis pensamientos para la solución es ahora:

– Cargue todas las páginas que tiene si el número de páginas es pequeño usando (ViewPager) .setOffScreenLimit (int limit)

-Paga la actividad principal y espera a que todas las páginas se carguen y luego continúa.

Ahora estoy atascado en la segunda parte, si alguien sabe esperar o retrasar el MainActivty para cargar páginas para completar o forzar la tarea de carga a primer plano, sería una gran ayuda para mí, gracias

  • SwipeListView uso NullPointerException
  • IllegalStateException: Fragmento <ThisFragment> no está actualmente en el FragmentManager
  • ¿Qué es una NullPointerException y cómo puedo solucionarlo?
  • Intenta invocar el método virtual 'void android.widget.Button.setOnClickListener (android.view.View $ OnClickListener)' en una referencia de objeto nulo
  • GetReadableDatabase a menudo, pero no siempre devuelve null
  • FindViewById devuelve null para WebView
  • Java.lang.NullPointerException en el paquete extras = data.getExtras ();
  • Java.lang.NullPointerException en getapplicationContext () al iniciar el adaptador
  • Nullpointer excepción en oncreateView () de fragmento
  • Excepción de puntero NULL de getSupportFragmentManager de Android en Fragmento
  • NullPointerException que no apunta a ninguna línea en mi código
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.