Actualiser ou forcer redessiner le fragment

J’ai un fragment qui gonfle une mise en page XML. Mon exigence est de mettre à jour la taille du texte sur toutes mes vues dans mon fragment lorsque mon activité est reprise. j’ai essayé

fragment.getView().invalidate(); 

qui n’a pas semblé faire le travail. J’ai aussi essayé

  fragment.getView().requestLayout(); 

ce qui n’a pas fonctionné non plus.

Sur une autre activité, j’ai un ListFragment qui doit faire la même chose. j’ai essayé

  listfragment.getListView().invalidate(); 

qui a fait l’affaire , rafraîchissant mon affichage de liste et redessinant tous les éléments qu’il contient.

Je ne comprends pas pourquoi l’un fonctionne mais pas l’autre.

J’ai également vu des gens recommander de lancer une transaction fragmentée et de remplacer le fragment actuel par un nouveau, et cela m’a incité à me demander

  1. Pourquoi devrais-je créer un tout nouveau fragment et remplacer mon fragment actuel alors que tout ce dont j’ai besoin est de rafraîchir le texte sur les vues contenues dans mon fragment.

  2. La méthode de transaction par fragment m’empêchera de définir mon fragment dans le fichier XML de présentation de mon activité et je devrai insérer le fragment par programme à la bonne position.

Y a-t-il une approche simple à cela?

Je ne pense pas qu’il existe une méthode pour cela. Le fragment reconstruit son interface utilisateur sur onCreateView () … mais cela se produit lorsque le fragment est créé ou recréé.

Vous devrez implémenter votre propre méthode updateUI ou spécifier quels éléments et comment ils doivent être mis à jour. C’est plutôt une bonne pratique, car vous devez le faire lorsque le fragment est créé de toute façon.

Cependant, si cela ne suffit pas, vous pouvez faire quelque chose comme remplacer fragment par le même en le forçant à appeler onCreateView()

 FragmentTransaction tr = getFragmentManager().beginTransaction(); tr.replace(R.id.your_fragment_container, yourFragmentInstance); tr.commit() 

REMARQUE

Pour actualiser ListView, vous devez appeler notifyDataSetChanged() sur l’adaptateur ListView.

Dans mon cas, detach et attach travail pour moi.

  getSupportFragmentManager() .beginTransaction() .detach(contentFragment) .attach(contentFragment) .commit(); 

detach().detach() ne fonctionne pas après la mise à jour de la bibliothèque de support 25.1.0 (peut être antérieure). Cette solution fonctionne bien après la mise à jour:

 getSupportFragmentManager() .beginTransaction() .detach(oldFragment) .commitNowAllowingStateLoss(); getSupportFragmentManager() .beginTransaction() .attach(oldFragment) .commitAllowingStateLoss(); 

Utilisez le code suivant pour actualiser le fragment:

 FragmentTransaction ftr = getFragmentManager().beginTransaction(); ftr.detach(EnterYourFragmentName.this).attach(EnterYourFragmentName.this).commit(); 

Pour résoudre le problème, j’utilise ceci:

 Fragment frg = null; frg = getFragmentManager().findFragmentByTag("Feedback"); final android.support.v4.app.FragmentTransaction ft = getFragmentManager().beginTransaction(); ft.detach(frg); ft.attach(frg); ft.commit(); 

Cela a fonctionné pour moi de l’intérieur Fragment:

 Fragment frg = null; Class fragmentClass; fragmentClass = MainFragment.class; try { frg = (android.support.v4.app.Fragment) fragmentClass.newInstance(); } catch(Exception ex) { ex.printStackTrace(); } getFragmentManager() .beginTransaction() .replace(R.id.flContent, frg) .commit(); 

voyons le code source ci-dessous. Ici, le nom du fragment est DirectoryOfEbooks. Une fois la tâche en arrière-plan terminée, je remplace le cadre par le fragment en cours. de sorte que le fragment se rafraîchit et recharge ses données

  import android.app.ProgressDialog; import android.content.DialogInterface; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.os.AsyncTask; import android.os.Bundle; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentTransaction; import android.support.v4.view.MenuItemCompat; import android.support.v7.app.AlertDialog; import android.support.v7.widget.DefaultItemAnimator; import android.support.v7.widget.GridLayoutManager; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.support.v7.widget.SearchView; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import android.widget.TextView; import android.widget.Toast; import com.github.mikephil.charting.data.LineRadarDataSet; import java.util.ArrayList; import java.util.List; /** * A simple {@link Fragment} subclass. */ public class DirectoryOfEbooks extends Fragment { RecyclerView recyclerView; twigsAdapter adapter; LinearLayoutManager linearLayoutManager; Cursor c; FragmentTransaction fragmentTransaction; SQLiteDatabase db; List directoryarraylist; public DirectoryOfEbooks() { // Required empty public constructor } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragment_directory_of_ebooks, container, false); directoryarraylist = new ArrayList<>(); db = getActivity().openOrCreateDatabase("notify", android.content.Context.MODE_PRIVATE, null); c = db.rawQuery("select * FROM branch; ", null); if (c.getCount() != 0) { c.moveToFirst(); while (true) { //String ISBN = c.getString(c.getColumnIndex("ISBN")); String branch = c.getString(c.getColumnIndex("branch")); branch_sync branchSync = new branch_sync(branch); directoryarraylist.add(branchSync); if (c.isLast()) break; else c.moveToNext(); } recyclerView = (RecyclerView) view.findViewById(R.id.directoryOfEbooks); adapter = new branchesAdapter(directoryarraylist, this.getContext()); adapter.setHasStableIds(true); recyclerView.setItemAnimator(new DefaultItemAnimator()); System.out.println("ebooks"); recyclerView.setHasFixedSize(true); linearLayoutManager = new LinearLayoutManager(this.getContext()); recyclerView.setLayoutManager(linearLayoutManager); recyclerView.setAdapter(adapter); System.out.println(adapter.getItemCount()+"adpater count"); } // Inflate the layout for this fragment return view; } public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //setContentView(R.layout.fragment_books); setHasOptionsMenu(true); } public void onPrepareOptionsMenu(Menu menu) { MenuInflater inflater = getActivity().getMenuInflater(); inflater.inflate(R.menu.refresh, menu); MenuItem menuItem = menu.findItem(R.id.refresh1); menuItem.setVisible(true); } public boolean onOptionsItemSelected(MenuItem item) { if (item.getItemId() == R.id.refresh1) { new AlertDialog.Builder(getContext()).setMessage("Refresh takes more than a Minute").setPositiveButton("Refresh Now", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { new refreshebooks().execute(); } }).setNegativeButton("Refresh Later", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { } }).setCancelable(false).show(); } return super.onOptionsItemSelected(item); } public class refreshebooks extends AsyncTask{ ProgressDialog progressDialog; @Override protected void onPreExecute() { super.onPreExecute(); progressDialog=new ProgressDialog(getContext()); progressDialog.setMessage("\tRefreshing Ebooks ....."); progressDialog.setCancelable(false); progressDialog.show(); } @Override protected Ssortingng doInBackground(Ssortingng... params) { Ebooksync syncEbooks=new Ebooksync(); Ssortingng status=syncEbooks.syncdata(getContext()); return status; } @Override protected void onPostExecute(Ssortingng s) { super.onPostExecute(s); if(s.equals("error")){ progressDialog.dismiss(); Toast.makeText(getContext(),"Refresh Failed",Toast.LENGTH_SHORT).show(); } else{ fragmentTransaction = getActivity().getSupportFragmentManager().beginTransaction(); fragmentTransaction.replace(R.id.mainframe, new DirectoryOfEbooks()); fragmentTransaction.commit(); progressDialog.dismiss(); adapter.notifyDataSetChanged(); Toast.makeText(getContext(),"Refresh Successfull",Toast.LENGTH_SHORT).show(); } } } } 

J’utilise remove et replace à la fois pour rafraîchir le contenu de Fragment like

 final FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction(); fragmentTransaction.remove(resetFragment).commit(); fragmentTransaction.replace(R.id.frame_container,resetFragment).commit();