Rafraîchir ou forcer 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 à l'intérieur de 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();

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();

a fait le tour, rafraîchissant ma vue de liste et redessiner tous les éléments à l'intérieur.

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

j'ai aussi vu des gens recommander d'initier un fragment de transactions et en remplaçant le fragment actuel par un nouveau, et cela m'a fait me demander"!--4-->

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

  2. la méthode de transaction Fragment m'empêchera de définir mon fragment dans la mise en page xml de mon activité et je devrai programmatiquement insérer le fragment à la bonne position.

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

41
demandé sur ps2010 2013-03-07 07:53:23

8 réponses

je ne pense pas qu'il existe une méthode pour cela. Le fragment reconstruit son UI sur onCreateView ()... mais cela arrive quand le fragment est créé ou recréé.

vous devrez mettre en œuvre votre propre méthode updateUI ou vous devrez spécifier quels éléments et comment ils doivent être mis à jour. C'est plutôt une bonne pratique, puisque vous devez le faire quand le fragment est créé de toute façon.

cependant si ce n'est pas assez vous pouvez faire quelque chose comme remplacer fragment avec le même un en les forçant à s'appeler onCreateView()

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

NOTE

pour rafraîchir ListView vous devez appeler notifyDataSetChanged() sur L'adaptateur de ListView.

25
répondu Jacek Kwiecień 2015-05-20 07:22:53

Dans mon cas,detach et attach travail pour moi.

 getSupportFragmentManager()
                .beginTransaction()
                .detach(contentFragment)
                .attach(contentFragment)
                .commit();
21
répondu baitouwei 2015-04-10 23:30:05

detach().detach() ne fonctionne pas après la mise à jour de la bibliothèque de soutien 25.1.0 (peut être plus tôt). Cette solution fonctionne bien après mise à jour:

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

getSupportFragmentManager()
    .beginTransaction()
    .attach(oldFragment)
    .commitAllowingStateLoss();
4
répondu lllyct 2016-12-22 09:35:19

Utilisez le code suivant pour rafraîchir à nouveau fragment:

FragmentTransaction ftr = getFragmentManager().beginTransaction();                          
ftr.detach(EnterYourFragmentName.this).attach(EnterYourFragmentName.this).commit();
3
répondu Vishal Vaishnav 2017-06-01 06:32:28

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();
1
répondu niteen bhende 2016-09-23 00:20:48

Cela a fonctionné pour moi à partir de l'intérieur de 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();
1
répondu abharku 2018-04-25 08:52:51

voyons le code source ci-dessous. Ici le nom du fragment est Directoriyofebooks. Après l'achèvement de la tâche de fond, je suis le remplacement du cadre avec fragment courant. ainsi 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;
        branchesAdapter adapter;
        LinearLayoutManager linearLayoutManager;
        Cursor c;
        FragmentTransaction fragmentTransaction;
        SQLiteDatabase db;
        List<branch_sync> 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<String,String,String>{
        ProgressDialog progressDialog;
        @Override
        protected void onPreExecute() {
            super.onPreExecute();
          progressDialog=new ProgressDialog(getContext());
            progressDialog.setMessage("\tRefreshing Ebooks .....");
            progressDialog.setCancelable(false);
            progressDialog.show();
        }

        @Override
        protected String doInBackground(String... params) {
            Ebooksync syncEbooks=new Ebooksync();
            String status=syncEbooks.syncdata(getContext());
            return status;

        }

        @Override
        protected void onPostExecute(String 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();
            }

        }
    }

    }
0
répondu murali krishna 2017-03-26 09:21:34

j'utilise supprimer et remplacer les deux pour rafraîchir le contenu de Fragment comme

final FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
fragmentTransaction.remove(resetFragment).commit();
fragmentTransaction.replace(R.id.frame_container,resetFragment).commit();
-1
répondu Xar E Ahmer 2017-01-27 07:36:44