recargar obtiene objeto forma eventos evento event elementos ejemplos dinámicamente dinámica dinamicamente crear creados creado como boton asociar agregar acceso android android-fragments navigation-drawer

android - obtiene - onclick jquery ejemplos



Android: ¿Es mejor crear un nuevo fragmento cada vez que se hace clic en un elemento del cajón de navegación o cargar los fragmentos creados anteriormente? (1)

Estoy implementando el patrón de cajón de navegación estándar para Android, con aproximadamente 10 fragmentos a los que el usuario puede acceder desde el cajón. Actualmente, estoy creando un nuevo Fragmento cada vez que se hace clic en un elemento de un cajón de navegación diferente, así:

// When a new navigation item at index is clicked FragmentTransaction ft = fragmentManager.beginTransaction(); ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE); Fragment newFragment = null; if (index == 0) fragment = new Fragment0(); ... ft.replace(R.id.container, newFragment); ft.commit();

Me he estado preguntando si sería más eficiente hacer algo como lo siguiente:

// Somewhere in onCreate Fragment[] fragments = new Fragment[n]; fragments[0] = new Fragment0(); fragments[1] = new Fragment1(); ... // When a new navigation item (at index) is clicked FragmentTransaction ft = fragmentManager.beginTransaction(); ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE); ft.replace(R.id.container, fragments[index]); ft.commit();

Mi principal preocupación es que algunos de los fragmentos contienen una gran cantidad de datos (listas bastante grandes y muchas vistas). ¿Habría algún problema que mantuviera todos estos fragmentos en la memoria y proporcionaría alguna ventaja sobre la instanciación de nuevos fragmentos cada vez (además de los cambios más rápidos entre los fragmentos)? ¿Existe una solución "mejor" generalmente aceptada?


Tuve un problema similar. Tomé un enfoque similar al suyo, y para ahorrar carga en el procesador, realicé el siguiente ajuste en cada llamada para crear una instancia para un objeto Fragment: (en contexto a mi uso en el método selectItem)

switch (position) { case 0: if (fragmentOne == null) fragmentOne = new FragmentOne(); getSupportFragmentManager().beginTransaction()....... break; case 1: if (fragmentTwo == null) fragmentTwo = new FragmentTwo(); getSupportFragmentManager()......

FragmentOne y FragmentTwo son las dos clases de Fragment diferentes y fragmentOne y fragmentTwo son sus objetos declarados como campos en MainActivity

Editar :

Me gustaría agregar cómo se puede seguir un enfoque similar con la matriz que contiene los fragmentos. En lugar de crear nuevos fragmentos en onCreate, hágalo cuando se hace clic en un elemento. En onCreate, envíe una llamada al cajón para seleccionar el fragmento que desea seleccionar de manera predeterminada en el inicio.

//somewhere in onCreate if (savedInstanceState == null) { selectItem(defaultFragment); } else selectItem(selectedFragment); //selectItem is method called by DrawerItemClickListener as well //in selectItem: when navigation item at index is clicked, the listener calls this switch (index) { case 0: if (fragments == null) { fragments = new Fragment[n]; fragment[0] = new Fragment0(); } else if (fragments[0] == null) { fragments[0] = new Fragment0(); } break; .... } FragmentTransaction ft = fragmentManager.beginTransaction(); ... ft.replace(R.id.container, fragments[index]); ft.commit();

No es necesario crear instancias de los fragmentos en onCreate ya que eso hace que el arranque sea lento. Créelos como y cuando sea necesario y luego use el mismo si existe. Los nuevos fragmentos se crean solo si se cargan por primera vez.