En una aplicación de Android, estoy cargando datos de un Db en un TableViewarchivo Fragment. Pero cuando recargo Fragment, muestra los datos anteriores. ¿Puedo volver a completar el Fragmentcon datos actuales en lugar de datos anteriores?
En una aplicación de Android, estoy cargando datos de un Db en un TableViewarchivo Fragment. Pero cuando recargo Fragment, muestra los datos anteriores. ¿Puedo volver a completar el Fragmentcon datos actuales en lugar de datos anteriores?
Respuestas:
Creo que desea actualizar el contenido del fragmento al actualizar la base de datos
Si es así, separe el fragmento y vuelva a colocarlo.
// Reload current fragment
Fragment frg = null;
frg = getSupportFragmentManager().findFragmentByTag("Your_Fragment_TAG");
final FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.detach(frg);
ft.attach(frg);
ft.commit();
Your_Fragment_TAG es el nombre que le dio a su fragmento cuando lo creó
Este código es para la biblioteca de soporte.
Si no es compatible con dispositivos más antiguos, use getFragmentManager en lugar de getSupportFragmentManager
[EDITAR]
Este método requiere que el Fragmento tenga una etiqueta.
En caso de que no lo tenga, entonces el método de @ Hammer es lo que necesita.
Esto actualizará el fragmento actual:
FragmentTransaction ft = getFragmentManager().beginTransaction();
if (Build.VERSION.SDK_INT >= 26) {
ft.setReorderingAllowed(false);
}
ft.detach(this).attach(this).commit();
En caso de que no tenga la etiqueta de fragmento, el siguiente código funciona bien para mí.
Fragment currentFragment = getActivity().getFragmentManager().findFragmentById(R.id.fragment_container);
if (currentFragment instanceof "NAME OF YOUR FRAGMENT CLASS") {
FragmentTransaction fragTransaction = (getActivity()).getFragmentManager().beginTransaction();
fragTransaction.detach(currentFragment);
fragTransaction.attach(currentFragment);
fragTransaction.commit();}
}
getActivity()en mi actividad. ¿Debería usar Activity.this...?
Puede actualizar su fragmento cuando sea visible para el usuario, simplemente agregue este código en su Fragmento, esto actualizará su fragmento cuando esté visible.
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
if (isVisibleToUser) {
// Refresh your fragment here
getFragmentManager().beginTransaction().detach(this).attach(this).commit();
Log.i("IsRefresh", "Yes");
}
}
Para actualizar el fragmento, la respuesta aceptada no funcionará en Nougat y la versión superior. Para que funcione en todos los sistemas operativos, puede hacer lo siguiente.
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
fragmentManager.beginTransaction().detach(this).commitNow();
fragmentManager.beginTransaction().attach(this).commitNow();
} else {
fragmentManager.beginTransaction().detach(this).attach(this).commit();
}
No puede volver a cargar el fragmento mientras está adjunto a una actividad, donde obtiene una " Fragment Already Added" excepción.
Por lo tanto, el fragmento debe separarse primero de su actividad y luego unirse. Todo se puede hacer usando la api fluida en una línea:
getFragmentManager().beginTransaction().detach(this).attach(this).commit();
Actualización: Esto es para incorporar los cambios realizados en API 26 y superior:
FragmentTransaction transaction = mActivity.getFragmentManager()
.beginTransaction();
if (Build.VERSION.SDK_INT >= 26) {
transaction.setReorderingAllowed(false);
}
transaction.detach(this).attach
(this).commit();
Para obtener más descripción de la actualización, consulte https://stackoverflow.com/a/51327440/4514796
MyFragment fragment = (MyFragment) getSupportFragmentManager().findFragmentByTag(FRAGMENT_TAG);
getSupportFragmentManager().beginTransaction().detach(fragment).attach(fragment).commit();
esto solo funcionará si usas FragmentManagerpara inicializar el fragmento. Si lo tiene como <fragment ... />en XML, no volverá a llamar onCreateView. Perdí mis 30 minutos para resolver esto.
Aquí lo que hice y funcionó para mí, uso firebase y cuando el usuario inicia sesión, quería actualizar el Fragmento actual primero, necesitará el contexto de la actividad porque el fragmento no tiene una forma de obtener el contexto a menos que lo configure desde Actividad o contexto aquí es el código que usé y trabajé en el lenguaje kotlin, creo que podrías usar el mismo en la clase java
override fun setUserVisibleHint(isVisibleToUser: Boolean) {
super.setUserVisibleHint(isVisibleToUser)
val context = requireActivity()
if (auth.currentUser != null) {
if (isVisibleToUser){
context.supportFragmentManager.beginTransaction().detach(this).attach(this).commit()
}
}
}
Use ContentProvideray cargue sus datos usando un 'CursorLoader'. Con esta arquitectura, sus datos se volverán a cargar automáticamente en los cambios de la base de datos. Use frameworks de terceros para su ContentProvider- realmente no quiere implementarlo usted mismo ...
Tuve el mismo problema, pero ninguno de los anteriores funcionó para el mío. o hubo un problema de backstack (después de cargar cuando el usuario presionó hacia atrás, volvería a usar el mismo fragmento) o no llamó alonCreaetView
finalmente hice esto:
public void transactFragment(Fragment fragment, boolean reload) {
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
if (reload) {
getSupportFragmentManager().popBackStack();
}
transaction.replace(R.id.main_activity_frame_layout, fragment);
transaction.addToBackStack(null);
transaction.commit();
}
El buen punto es que tampoco necesita la etiqueta o la identificación del fragmento. si quieres recargar
Utilice el método onResume ... tanto en la actividad del fragmento como en la actividad que contiene el fragmento.
getActivity().getSupportFragmentManager().beginTransaction().replace(GeneralInfo.this.getId(), new GeneralInfo()).commit();
GeneralInfo es mi clase de Fragmento GeneralInfo.java
Lo puse como método en la clase de fragmento:
public void Reload(){
getActivity().getSupportFragmentManager().beginTransaction().replace(LogActivity.this.getId(), new LogActivity()).commit();
}
La manera más fácil
hacer un método estático público que contenga viewpager.setAdapter
hacer que el adaptador y el visor estén estáticos
public static void refreshFragments(){
viewPager.setAdapter(adapter);
}
llamar a cualquier lugar, cualquier actividad, cualquier fragmento.
MainActivity.refreshFragments();