En una aplicación de Android, estoy cargando datos de un Db en un TableView
archivo Fragment
. Pero cuando recargo Fragment
, muestra los datos anteriores. ¿Puedo volver a completar el Fragment
con datos actuales en lugar de datos anteriores?
En una aplicación de Android, estoy cargando datos de un Db en un TableView
archivo Fragment
. Pero cuando recargo Fragment
, muestra los datos anteriores. ¿Puedo volver a completar el Fragment
con 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 FragmentManager
para 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 ContentProvider
ay 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();