In un'applicazione Android sto caricando i dati da un Db in TableView
un file Fragment
. Ma quando lo ricarico Fragment
mostra i dati precedenti. Posso ripopolare Fragment
con i dati attuali invece che con i dati precedenti?
In un'applicazione Android sto caricando i dati da un Db in TableView
un file Fragment
. Ma quando lo ricarico Fragment
mostra i dati precedenti. Posso ripopolare Fragment
con i dati attuali invece che con i dati precedenti?
Risposte:
Penso che tu voglia aggiornare il contenuto del frammento all'aggiornamento del db
In tal caso, staccare il frammento e ricollegarlo
// 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 è il nome che hai dato al tuo frammento quando lo hai creato
Questo codice è per la libreria di supporto.
Se non stai supportando i dispositivi più vecchi, usa semplicemente getFragmentManager invece di getSupportFragmentManager
[MODIFICARE]
Questo metodo richiede che il frammento abbia un tag.
Nel caso in cui non ce l'hai, il metodo di @ Hammer è ciò di cui hai bisogno.
Questo aggiornerà il frammento corrente:
FragmentTransaction ft = getFragmentManager().beginTransaction();
if (Build.VERSION.SDK_INT >= 26) {
ft.setReorderingAllowed(false);
}
ft.detach(this).attach(this).commit();
Nel caso in cui non si disponga del tag fragment, il codice seguente funziona bene per me.
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()
nella mia attività. Dovrei usare Activity.this...
?
puoi aggiornare il tuo frammento quando è visibile all'utente, basta aggiungere questo codice nel tuo frammento questo aggiornerà il tuo frammento quando sarà visibile.
@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");
}
}
Per aggiornare il frammento la risposta accettata non funzionerà su Nougat e versioni successive. Per farlo funzionare su tutti i sistemi operativi puoi fare quanto segue.
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();
}
Non puoi ricaricare il frammento mentre è collegato a un'attività, dove " Fragment Already Added
" si ottiene un'eccezione.
Quindi il frammento deve essere prima staccato dalla sua attività e poi attaccato. Tutto può essere fatto utilizzando l'api fluente in una riga:
getFragmentManager().beginTransaction().detach(this).attach(this).commit();
Aggiornamento: questo per incorporare le modifiche apportate all'API 26 e versioni successive:
FragmentTransaction transaction = mActivity.getFragmentManager()
.beginTransaction();
if (Build.VERSION.SDK_INT >= 26) {
transaction.setReorderingAllowed(false);
}
transaction.detach(this).attach
(this).commit();
Per una descrizione più dettagliata dell'aggiornamento, consultare https://stackoverflow.com/a/51327440/4514796
MyFragment fragment = (MyFragment) getSupportFragmentManager().findFragmentByTag(FRAGMENT_TAG);
getSupportFragmentManager().beginTransaction().detach(fragment).attach(fragment).commit();
questo funzionerà solo se si usa FragmentManager
per inizializzare il frammento. Se lo hai <fragment ... />
in XML, non chiamerà di onCreateView
nuovo. Ho sprecato i miei 30 minuti per capirlo.
Ecco cosa ho fatto e ha funzionato per me, uso Firebase e quando l'utente effettua l'accesso, volevo aggiornare prima il frammento corrente, dovrai prima richiedere il contesto dall'attività perché il frammento non ha un modo per ottenere il contesto a meno che tu non lo imposti da Attività o contesto qui è il codice che ho usato e lavorato in linguaggio kotlin penso che potresti usare lo stesso nella classe 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()
}
}
}
Usa ContentProvider
ae carica i tuoi dati usando un 'CursorLoader'. Con questa architettura i tuoi dati verranno ricaricati automaticamente alle modifiche del database. Usa framework di terze parti per il tuo ContentProvider
- non vuoi davvero implementarlo da solo ...
Ho avuto lo stesso problema ma nessuno dei precedenti ha funzionato per il mio. o si è verificato un problema di backstack (dopo il caricamento, quando l'utente ha premuto indietro, sarebbe andato di nuovo lo stesso frammento) o non ha chiamato ilonCreaetView
finalmente l'ho fatto:
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();
}
il punto positivo è che non hai bisogno del tag o dell'ID del frammento. se vuoi ricaricare
Utilizza il metodo onResume ... sia sull'attività del frammento che sull'attività che contiene il frammento.
getActivity().getSupportFragmentManager().beginTransaction().replace(GeneralInfo.this.getId(), new GeneralInfo()).commit();
GeneralInfo
è la mia classe Frammento GeneralInfo.java
L'ho inserito come metodo nella classe fragment:
public void Reload(){
getActivity().getSupportFragmentManager().beginTransaction().replace(LogActivity.this.getId(), new LogActivity()).commit();
}
Ad esempio con TabLayout: implementa semplicemente OnTabSelectedListener. Per ricaricare la pagina, puoi utilizzare implement SwipeRefreshLayout.OnRefreshListener iepublic class YourFragment extends Fragment implements SwipeRefreshLayout.OnRefreshListener {
il metodo onRefresh () sarà @Override dall'interfaccia, ovvero:
@Override
public void onRefresh() {
loadData();
}
Ecco il layout:
<com.google.android.material.tabs.TabLayout
android:id="@+id/tablayout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/colorPrimaryLighter"
app:tabGravity="fill"
app:tabIndicatorColor="@color/white"
app:tabMode="fixed"
app:tabSelectedTextColor="@color/colorTextPrimary"
app:tabTextColor="@color/colorTextDisable" />
Codice nella tua attività
TabLayout tabLayout = (TabLayout) findViewById (R.id.tablayout); tabLayout.setupWithViewPager (viewPager);
tabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
@Override
public void onTabSelected(TabLayout.Tab tab) {
if (tab.getPosition() == 0) {
yourFragment1.onRefresh();
} else if (tab.getPosition() == 1) {
yourFragment2.onRefresh();
}
}
@Override
public void onTabUnselected(TabLayout.Tab tab) {
}
@Override
public void onTabReselected(TabLayout.Tab tab) {
}
});
Il modo più semplice
crea un metodo statico pubblico contenente viewpager.setAdapter
rendere statici l'adattatore e il viewpager
public static void refreshFragments(){
viewPager.setAdapter(adapter);
}
chiama ovunque, qualsiasi attività, qualsiasi frammento.
MainActivity.refreshFragments();